河南省第八届ACM程序设计大赛

时间:2021-01-13 09:39:11

A:挑战密室

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <vector>
#include <queue>
using namespace std;
typedef long long LL;
#define N 600
#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f char s[N]; int Find(int x, int len)
{
int i; for(i=x; i<=len; i++)
if(s[i]=='=')
return i+;
}
int Find2(int x, int len)
{
int i; for(i=x; i<=len; i++)
if(s[i]=='+')
return i-;
return len;
} int Find1(int x)
{
int i, len = strlen(s)-; for(i=x; i<len; i++)
if(s[i]==')')
return i-; return len;
} int Slove(int start, int e)
{
int k=, sum=, pre, i; for(i=start; i<=e; i++)
{
if(s[i]>='' && s[i]<='')
k = k* + s[i]-'';
else break;
} for( ;i<=e; i++)
{
if(s[i]=='N')
{
if(s[i+]=='a')
{
sum += ;
pre = ;
i++;
}
else
{
sum += ;
pre = ;
}
}
else if(s[i]=='C')
{
if(s[i+]=='l')
{
sum += ;
pre = ;
i++;
}
else if(s[i+]=='a')
{
sum += ;
pre = ;
i++;
}
else
{
sum += ;
pre = ;
}
}
else if(s[i]=='O')
{
sum += ;
pre = ;
}
else if(s[i]=='S')
{
sum += ;
pre = ;
}
else if(s[i]=='H')
{
sum += ;
pre = ;
}
else if(s[i]=='A')
{
sum += ;
pre = ;
i++;
}
else if(s[i]=='Z')
{
sum += ;
pre = ;
i++;
}
else if(s[i]=='(')
{
int Index = Find1(i);
int w = Slove(i+, Index);
sum += w;
pre = w;
i = Index+;
}
else
{
int z=;
while(s[i]>='' && s[i]<='')
{
z = z* + s[i]-'';
i++;
}
i--;
sum += (z-)*pre;
}
} if(k==) return sum;
else return k*sum;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int Index1, Index2, sum, len; scanf("%s", s); len = strlen(s)-; Index1 = Find(, len);
Index2 = Find2(Index1, len);
sum = Slove(Index1, Index2); printf("%04d\n", sum);
}
return ;
}

B:最大岛屿

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <vector>
#include <queue>
using namespace std;
typedef long long LL;
#define N 550
#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f int s[N][N];
int n, m, Max, dir[][]={{-,-},{-,},{-,},{,-},{,},{,-},{,},{,}}; int DFS(int x, int y)
{
int i, nx, ny, sum=; s[x][y] = ;
for(i=; i<; i++)
{
nx = x + dir[i][];
ny = y + dir[i][];
if(nx>= && nx<n && ny>= && ny<m && s[nx][ny])
{
sum += DFS(nx, ny) + ;
}
} return sum;
} int main()
{
int T; while(scanf("%d%d%d", &n, &m, &T)!=EOF)
{
int i, j, ans, sum=, Max=; met(s, );
for(i=; i<n; i++)
for(j=; j<m; j++)
scanf("%1d", &s[i][j]); for(i=; i<n; i++)
for(j=; j<m; j++)
{
if(s[i][j]==)
{
ans = DFS(i, j) + ;
///printf("%d\n", ans);
if(ans) sum++;
Max = max(Max, ans);
}
} printf("%d %d\n", sum, Max*T);
}
return ;
}

C:最小换乘

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
using namespace std;
#define N 1305
#define INF 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a)) int vis[N], G[N][N], n, dist[N]; int Dij(int s)
{
met(vis, );
dist[s] = ;
///vis[s] = 1;
for(int i=; i<=n; i++)
{
int Min = INF, Index = -;
for(int j=; j<=n; j++)
{
if(!vis[j] && Min>dist[j])
{
Min = dist[j];
Index = j;
}
}
if(Index == -)break;
vis[Index] = ;
for(int j=; j<=n; j++)
{
if(!vis[j] && dist[j] > dist[Index]+G[Index][j])
{
dist[j] = dist[Index] + G[Index][j];
}
}
}
return dist[n];
} int main()
{
int m, T;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &m, &n); for(int i=; i<=n; i++)
{
dist[i] = INF;
for(int j=; j<=n; j++)
G[i][j] = INF;
G[i][i] = ;
} for(int i=; i<=m; i++)
{
char ch; int k = , a[N]; while(scanf("%d%c", &a[k], &ch),ch==' ')
k++; for(int j=; j<=k; j++)
{
for(int ii=j+; ii<=k; ii++)
G[a[j]][a[ii]] = ;
}
}
int ans = Dij();
if(ans == INF)
puts("NO");
else
printf("%d\n", ans-);
}
return ;
} /** 2
3 7
6 7
4 7 3 6
2 1 3 5
2 6
1 3 5
2 6 4 3 */

D:引水工程

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
using namespace std;
#define N 305
#define INF 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a)) int vis[N], G[N][N], n, dist[N]; int Prim(int s)
{
for(int i=; i<=n; i++)
dist[i] = G[s][i];
met(vis, );
vis[s] = ;
int ans = ;
for(int i=; i<=n; i++)
{
int Min = INF, Index = -;
for(int j=; j<=n; j++)
{
if(!vis[j] && dist[j]<Min)
{
Min = dist[j];
Index = j;
}
}
if(Index == -)break;
vis[Index] = ;
ans += Min;
for(int j=; j<=n; j++)
{
if(!vis[j] && dist[j]>G[Index][j])
{
dist[j] = G[Index][j];
}
}
}
return ans;
} int main()
{
int w, T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n); for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
G[i][j] = G[j][i] = INF;
}
} for(int i=; i<=n; i++)
{
scanf("%d", &w);
G[][i] = G[i][] = w;
}
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
scanf("%d", &w);
G[i][j] = w;
}
}
int ans = Prim();
printf("%d\n", ans);
}
return ;
}

F:Distribution

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
using namespace std;
#define N 10100
#define met(a, b) memset(a, b, sizeof(a)) int main()
{
int n, m, x[N], y[N], a, b;
while(scanf("%d %d", &n, &m)!=EOF)
{
for(int i=; i<n; i++)
{
scanf("%d %d", &x[i], &y[i]);
}
for(int i=; i<=m; i++)
{
scanf("%d %d", &a, &b);
int cnt1 = , cnt2 = ;
for(int j=; j<n; j++)
{
if((x[j]>a && y[j]>b) || (x[j]<a && y[j]<b))
cnt1++;
else if((x[j]<a && y[j]>b) || (x[j]>a && y[j]<b))
cnt2++;
}
printf("%d\n", cnt1-cnt2);
}
}
return ;
}

G:Interference Signal

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <vector>
#include <queue>
using namespace std;
typedef long long LL;
#define N 1100
#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f int a[N]; int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, k, i, j;
double Max=, ans; scanf("%d%d", &n, &k); met(a, );
for(i=; i<n; i++)
scanf("%d", &a[i]); for(i=; i<n; i++)
{
int sum = ;
for(j=i; j<n; j++)
{
sum += a[j];
if((j-i+)>=k)
{
ans = (sum*1.0)/(j-i+);
Max = max(Max, ans);
}
}
} printf("%d\n", (int)(Max*));
}
return ;
}