之前的Round A晋级了...但是HR说今年7月因为Codejam的原因面过一次了不给再面了..所以Round C和Round B都没怎么做..这次最后一场Round D还是水了一发...虽然太弱了..水了两题...但还是拿了个通过笔试的邮件...估计还是不会给面...
A - Dynamic Grid
题意:
给了一个n*m的01矩阵...最大100*100...现在有1000次操作...每次操作分为两个..一个是询问矩阵中有多少个1的连通块..第二个是改变某个位置的值...
题解:
100*100*1000可以接受...所以暴力求解.
Code:
#include <stdio.h> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <map> #include <stack> #include <string.h> using namespace std; int a[105][105],n,m,f[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; char s[10],str[105][105]; bool used[105][105]; void dfs(int x,int y){ if (x==0 || y==0 || x>n || y>m) return; if (!a[x][y]) return; if (used[x][y]) return; used[x][y]=true; for (int k=0;k<4;k++) dfs(x+f[k][0],y+f[k][1]); } int main(){ int T,cases; freopen("A-large.in.txt","r",stdin); freopen("output.txt","w",stdout); scanf("%d",&T); for (int cases=1;cases<=T;cases++){ printf("Case #%d:\n",cases); scanf("%d%d",&n,&m); for (int x=1;x<=n;x++) scanf("%s",str[x]+1); for (int x=1;x<=n;x++) for (int y=1;y<=m;y++) a[x][y]=str[x][y]-'0'; int num; scanf("%d",&num); while (num--){ scanf("%s",s); if (s[0]=='Q'){ int ans=0; memset(used,false,sizeof(used)); for (int x=1;x<=n;x++) for (int y=1;y<=m;y++) if (a[x][y] && !used[x][y]){ ans++; dfs(x,y); } printf("%d\n",ans); }else{ int x,y,z; scanf("%d%d%d",&x,&y,&z); x++,y++; a[x][y]=z; } } } return 0; }
题意:
有N个气球(N<=100)..有一个大楼最多M层(M<=1000)...现在每个气球都在各自的楼层..且在各自的位置..比如可以用(x,y)描述一个气球...而不同的楼层有不同的风力..可以使得再该楼层的气球每秒种向正x方向或者负x方向移动多少距离..对于一个气球..可以用|Hi-Hj|的能量移动其楼层..其中Hi是该气球本来的位置..Hj是移动到的位置..且上下移动是瞬间完成的...当一个气球移动到x=0的位置时就可以停下了..现在给出了可以使用的总能量..问最少需要多少的时间让所有的气球都到达x=0的位置..
题解:
如果直接从能量的角度出发..问题会变得很复杂..因为对于一个气球为了能快速到达x=0而使用了能量..可能会使得另一个气球所需要的能量不够用..换一个角度..可以发现时间对于每个气球来说是很独立的...且当总时间越多...所需要的能量必然是非递增的...有一个单调的关系...那么二分时间后计算每个气球在这个时间上到达x=0所需要的最少能量之和是否小于可以使用的能量...
Code:
#include <stdio.h> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <map> #include <stack> #include <string.h> using namespace std; const int oo=10005; int V[1005],H[105],P[105]; bool judge(int n,int m,int q,int t){ int sum=0,k; for (int i=1;i<=n;i++){ int x,x0,temp=oo; if (P[i]==0) continue; for (int h=0;h<m;h++){ if (!V[h]) continue; if (P[i]>0 && V[h]>0) continue; if (P[i]<0 && V[h]<0) continue; x0=abs(P[i]),x=abs(V[h]); if ((x0+x-1)/x>t) continue; temp=min(temp,abs(h-H[i])); } sum+=temp; } return sum<=q; } int main(){ int T,cases; freopen("B-large.in.txt","r",stdin); freopen("output.txt","w",stdout); scanf("%d",&T); for (int cases=1;cases<=T;cases++){ printf("Case #%d: ",cases); int n,m,q; scanf("%d%d%d",&n,&m,&q); for (int i=0;i<m;i++) scanf("%d",&V[i]); for (int i=1;i<=n;i++) scanf("%d%d",&P[i],&H[i]); int L=-1,R=oo; while (R-L>1){ int mid=(L+R)>>1; if (judge(n,m,q,mid)) R=mid; else L=mid; } if (R==oo) puts("IMPOSSIBLE"); else printf("%d\n",R); } return 0; }