ZOJ Monthly, November 2008

来源:互联网 发布:朋友圈编辑软件 编辑:程序博客网 时间:2024/05/16 23:02

A 用tree树做,注意排序1~len-1再构造树

B 类似的博弈,找出输的组合来计算下面能赢的组合

C 求圆与环的相交面积,将环拆开成两圆分别求交做差即可,注意判断接近0时输出形势

D 听说是宽搜,没有看

E 动态规划计算每个出口的最优,o(n*n*n),注意s型的路径

F把大数拆成3进制再从高到低逐位求和

G

H

I

附B:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3057

#include <iostream>
#include <algorithm>
using namespace std;
#define N 301
bool tag[N][N][N];
int a[3];
int main()
{
int i,j,k,r;
memset(tag,0,sizeof(tag));
for(i=0;i<N;i++)
   for(j=i;j<N;j++)
    for(k=j;k<N;k++)
    {
     if(tag[i][j][k])continue;
     for(r=k+1;r<N;r++)
      tag[i][j][r]=1;
     for(r=j+1;r<=k;r++)
      tag[i][r][k]=1;
     for(r=k+1;r<N;r++)
      tag[i][k][r]=1;
     for(r=i+1;r<=j;r++)
      tag[r][j][k]=1;
     for(r=j+1;r<=k;r++)
      tag[j][r][k]=1;
     for(r=k+1;r<N;r++)
      tag[j][k][r]=1;
     for(r=1;k+r<N;r++)
      tag[i][j+r][k+r]=1;
     for(r=1;k+r<N&&i+r<=j;r++)
      tag[i+r][j][k+r]=1;
     for(;k+r<N;r++)
      tag[j][i+r][k+r]=1;
     for(r=1;j+r<=k;r++)
      tag[i+r][j+r][k]=1;
     for(;j+r<N&&i+r<=k;r++)
      tag[i+r][k][j+r]=1;
     for(;j+r<N;r++)
      tag[k][i+r][j+r]=1;
     break;
    }
while(scanf("%d%d%d",&a[0],&a[1],&a[2])!=EOF)
{
   sort(a,a+3);
   if(tag[a[0]][a[1]][a[2]])printf("1\n");
   else printf("0\n");
}
return 0;
}

附F: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3061

#include<stdio.h>
#define N 22
int bit[N],num[N];
int main()
{
int i,n,k,r;
long long res,p,p0;
num[0]=1;
for(i=1;i<N;i++)
   num[i]=3*num[i-1];
while(scanf("%d %d",&n,&k)!=EOF)
{
   int t=n;
   for(i=0;n;i++){
    bit[i]=n%3;
    n/=3;
   }
   res=0;
   p=-1;
   r=0;
   p0=0;
   for(i--;i>=0;i--){
    if(p+1){
     res+=p/3;
     p*=2;
     p+=r*num[i];
     r*=2;
    }
    else p=0;
    if(bit[i]==0){
     p0*=3;
    }
    else if(bit[i]==1){
     p0*=3;
     p+=p0*num[i]/(t+1);
     p0=p0*(t+1-num[i])/(t+1);
     p0+=t+1-num[i];
     r++;
    }
    else{
     r+=2;
     res+=p0*(t+1-2*num[i])/(t+1);
     p0*=3;
     p+=2*p0*num[i]/(t+1)+num[i];
     break;
    }
    t-=num[i]*bit[i];
   
   }
   if(i<0)res+=p0;
   else if(i>0){
    for(i--;i>=0;i--){
     res+=p/3;
     p*=2;
     p+=r*num[i];
     r*=2;
    }
   }
   res+=p;
   printf("%lld\n",res%k);
}
return 0;
}

原创粉丝点击