一.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);
}