acm常用技巧三 POJ 3279
来源:互联网 发布:js loadasync load 编辑:程序博客网 时间:2024/05/16 05:09
一.POJ 3279
const int dx[]={-1,0,0,0,1};const int dy[]={0,-1,0,1,0};int M,N;int tile[MXN][MXN];int opt[MXM][MXN];int flip[MXM][MXN];int get(int x,int y){ int c=tile[x][y]; for(int d=0;d<5;++d){ int x2=x+dx[d],y2=y+dy[d]; if(0<=x2&&x2<M&&0<=y2&&y2<N) c+=flip[x2][y2]; } return c%2;}int calc(){ for(int i=1;i<M;++i) for(int j=0;j<N;++j) if(get(i-1,j)) { flip[i][j]=1; } for(int j=0;j<N;++j) if(get(M-1,j)){ return -1; } int res=0; for(int i=0;i<M;++i) for(int j=0;j<N;++j) res+=flip[i][j]; return res;}void Fun(){ int res=-1; for(int i=0;i<1<<N;++i){ memset(flip,0,sizeof(flip)); for(int j=0;j<N;++j) flip[0][N-j-1]=i>>j&1; int num=calc(); if(num>=0&&(res<0||res>num)){ res=num; memcpy(opt,flip,sizeof(flip)); } } if(res<0) puts("IMPOSSIBLE"); else{ for(int i=0;i<M;++i) for(int j=0;j<N;++j) printf("%d%c",opt[i][j],j+1==N?'\n':' '); }}
二.POJ 3684
const double g=10.0;int N,H,R,T;double y[MXN];double calc(int T){ if(T<0) return H; double t=sqrt(2*H/g); int k=(int)(T/t); if(k%2==0){ double d=T-k*t; return H-g*d*d/2; }else{ double d=k*t+t-T; return H-g*d*d/2; }}void Fun(){ for(int i=0;i<N;++i) y[i]=calc(T-i); sort(y,y+N); for(int i=0;i<N;++i) printf("%.2f%c",y[i]+2*R*i/100.0,i+1==N?'\n':' ');}
三.POJ 2785
void Fun(){ for(int i=0;i<n;++i) for(int j=0;j<n;++j) CD[i*n+j]=C[i]+D[j]; sort(CD,CD+n*n); LL res=0; for(int i=0;i<n;++i) for(int j=0;j<n;++j){ int cd=-(A[i]+B[j]); res+=upper_bound(CD,CD+n*n,cd)-lower_bound(CD,CD+n*n,cd); } printf("%lld\n",res);}