第一篇这个站上的博客,总结USACO的程序
总结一下思路
USACO1.1
Your Ride Is Here
12345678910111213141516171819202122using namespace std;char a[10],b[10];int main(){int i,j,k,n=1,m=1,l1,l2;scanf("%s%s",&a,&b);l1=strlen(a);l2=strlen(b);for(i=0;i<l1;i++){n*=a[i]-'A'+1;n%=47;}for(i=0;i<l2;i++){m*=(int)b[i]-'A'+1;m%=47;}if(n==m) printf("GO\n");else printf("STAY\n");return 0;}Greedy Gift Givers
1234567891011121314151617181920212223242526272829303132using namespace std;const int maxn=10+10,maxl=14+10;char s[maxn][maxl],c[maxl];int a[maxn];int main(){int i,j,k,n,m;int x,y;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%s",s[i]);while(scanf("%s%d%d",c,&x,&y)!=EOF){if(y==0) continue;for(i=1;i<=n;i++)if(!strcmp(c,s[i]))a[i]+=(x/y)*y;for(i=1;i<=y;i++){scanf("%s",c);for(j=1;j<=n;j++)if(!strcmp(c,s[j]))a[j]-=x/y;}}for(i=1;i<=n;i++)printf("%s %d\n",s[i],-1*a[i]);return 0;}Friday the Thirteenth
12345678910111213141516171819202122232425262728293031using namespace std;bool pd(int x){return x%400==0 || (x%100!=0 && x%4==0);}int ans[7];int main(){int i,j,k=13,n,m;scanf("%d",&n);for(i=1900;i<1900+n;i++)for(j=1;j<=12;j++){k%=7;ans[k]++;if(j==2){if(pd(i)) k+=29;else k+=28;}else if(j==4 || j==6 || j==9 || j==11) k+=30;else k+=31;}printf("%d %d ",ans[6],ans[0]);for(i=1;i<=5;i++)printf("%d ",ans[i]);return 0;}Broken Necklace
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950using namespace std;const int maxn=350*2+10;int a[maxn],ls,rs;int main(){int i,j,k,k1,n,m;scanf("%d",&n);char s[maxn],c;scanf("%s",s);for(i=1;i<=n;i++){c=s[i-1];if(c=='r') a[i]=a[i+n]=1;if(c=='b') a[i]=a[i+n]=2;if(c=='w') a[i]=a[i+n]=3;}int Max=0;m=n*2;for(i=1;i<=m;i++){if(k1==3) ls++,k1=a[i];else if(ls==0) ls=1,k1=a[i];else if(k1==a[i] || a[i]==3) ls++;else{ls=1,k1=a[i];j=i-1;while(a[j]==3) j--,ls++;}rs--;if(rs<1){rs=1;j=i+1;while(a[j]==3) j++,rs++;k=j+1;while((a[j]==a[k] || a[k]==3) && j+1<=m) k++,rs++;}if(ls+rs>Max){Max=ls+rs;}if(Max>=n){printf("%d\n",n);return 0;}}printf("%d\n",Max);return 0;}
USACO1.2
Milking Cows
123456789101112131415161718192021222324252627282930313233343536373839using namespace std;const int maxn=5000+10;struct point{int s,t;}a[maxn];bool cmp(point A,point B){return A.s<B.s;}int x,y;int Maxlast,Maxfree;int main(){int i,j,k,n,m;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d%d",&a[i].s,&a[i].t);sort(a+1,a+n+1,cmp);x=a[1].s;y=a[1].t;Maxlast=max(Maxlast,y-x);for(i=2;i<=n;i++){if(a[i].s<=y){if(a[i].t>y) y=a[i].t;}else{Maxfree=max(Maxfree,a[i].s-y);x=a[i].s;y=a[i].t;}Maxlast=max(Maxlast,y-x);}printf("%d %d\n",Maxlast,Maxfree);return 0;}Transformations
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104using namespace std;char n,a[11][11],b[11][11],c[11][11];bool pd(){int i,j;for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(b[i][j]!=c[i][j])return false;return true;}void work1(){int i,j;for(i=1;i<=n;i++)for(j=1;j<=n;j++)b[j][n-i+1]=a[i][j];}void work2(){int i,j;for(i=1;i<=n;i++)for(j=1;j<=n;j++)b[n-i+1][n-j+1]=a[i][j];}void work3(){int i,j;for(i=1;i<=n;i++)for(j=1;j<=n;j++)b[n-j+1][i]=a[i][j];}void work4(){int i,j;for(i=1;i<=n;i++)for(j=1;j<=n;j++)b[i][n-j+1]=a[i][j];}void work6(){int i,j;for(i=1;i<=n;i++)for(j=1;j<=n;j++)b[i][j]=a[i][j];}void work5(){work4();int i,j;for(i=1;i<=n;i++)for(j=1;j<=n;j++)a[i][j]=b[i][j];}int main(){int i,j,k,m;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%s",a[i]+1);for(i=1;i<=n;i++)scanf("%s",c[i]+1);work1();if(pd()){puts("1");return 0;}work2();if(pd()){puts("2");return 0;}work3();if(pd()){puts("3");return 0;}work4();if(pd()){puts("4");return 0;}work6();if(pd()){puts("6");return 0;}work5();work1();if(pd()){puts("5");return 0;}work2();if(pd()){puts("5");return 0;}work3();if(pd()){puts("5");return 0;}puts("7");return 0;}Palindromic Squares
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950using namespace std;int n;int a[100+10],b[100+10],alen=0,blen=0;bool pd(){int i;for(i=1;i<=blen/2;i++)if(b[i]!=b[blen-i+1])return false;return true;}void out(){int i;for(i=alen;i>=1;i--)if(a[i]>=10) printf("%c",a[i]-10+'A');else printf("%d",a[i]);putchar(' ');for(i=blen;i>=1;i--)if(b[i]>=10) printf("%c",b[i]-10+'A');else printf("%d",b[i]);putchar('\n');}void work(int x){int i,j,k=x*x;int y=x;alen=0;blen=0;while(y>0){a[++alen]=y%n;y/=n;}while(k>0){b[++blen]=k%n;k/=n;}if(!pd()) return;out();}int main(){int i,j,k,m;scanf("%d",&n);for(i=1;i<=300;i++)work(i);return 0;}Dual Palindromes
12345678910111213141516171819202122232425262728293031323334353637383940using namespace std;int n;int b[100+10],blen=0;bool pd(){int i;for(i=1;i<=blen/2;i++)if(b[i]!=b[blen-i+1])return false;return true;}bool work(int x,int y){int i,j,k=x;blen=0;while(k>0){b[++blen]=k%y;k/=y;}return pd();}int main(){int i,j,k,m;scanf("%d%d",&n,&m);int sum=0;for(i=m+1;sum<n;i++){int num=0;for(j=2;j<=10;j++)if(work(i,j)) num++;if(num>=2){printf("%d\n",i);sum++;}}return 0;}
USACO1.3
Mixing Milk
123456789101112131415161718192021222324252627282930313233343536using namespace std;const int maxn=5000+10;struct point{int x,y;}a[maxn];bool cmp(point A,point B){return A.x<B.x;}int main(){int i,j,k,n,m;scanf("%d%d",&n,&m);for(i=1;i<=m;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a+1,a+m+1,cmp);i=0;int ans=0;while(1){i++;if(n<=a[i].y){ans+=a[i].x*n;break;}else{ans+=a[i].x*a[i].y;n-=a[i].y;}}printf("%d\n",ans);return 0;}Barn Repair
1234567891011121314151617181920212223242526272829using namespace std;const int maxn=200+10;int a[maxn],k[maxn];int main(){int i,j,n,m;int s,c;int last;scanf("%d%d%d",&m,&s,&c);for(i=1;i<=c;i++)scanf("%d",&k[i]);sort(k+1,k+c+1);last=k[1];for(i=2;i<=c;i++){a[i-1]=k[i]-last-1;last=k[i];}sort(a+1,a+c);int ans=c;for(i=1;i<=c-m;i++)ans+=a[i];printf("%d\n",ans);return 0;}Prime Cryptarithm
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647using namespace std;bool p[10];int num[10],ans;bool pd(int x){while(x>0){if(!p[x%10]) return false;x/=10;}return true;}int sw(int x){int sum=0;while(x>0){sum++;x/=10;}return sum;}int main(){int i,j,k,n,m;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num[i]);p[num[i]]=true;}int a,b,c,d,e;int x,y;for(a=1;a<=n;a++)for(b=1;b<=n;b++)for(c=1;c<=n;c++){x=num[a]*100+num[b]*10+num[c];for(d=1;d<=n;d++)if(pd(x*num[d]) && sw(x*num[d])==3)for(e=1;e<=n;e++)if(pd(x*num[e]) && pd(x*(num[d]*10+num[e])) && sw(x*num[e])==3 && sw(x*(num[d]*10+num[e]))==4){ans++;}}printf("%d\n",ans);return 0;}wormhole
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859using namespace std;const int maxn=12+10;struct point{int x,y;}a[maxn];int n,next[maxn],part[maxn];bool cmp(point A,point B){return A.y<B.y || (A.y==B.y && A.x<B.x);}bool pd(){int i,j,tmp;for(i=1;i<=n;i++){tmp=i;for(j=1;j<=n;j++)tmp=next[part[tmp]];if(tmp!=0) return true;}return false;}int dfs(){int tot=0,i;for(i=1;i<=n;i++)if(part[i]==0)break;if(i>n){if(pd()) return 1;return 0;}int j;for(j=i+1;j<=n;j++)if(part[j]==0){part[j]=i;part[i]=j;tot+=dfs();part[i]=0;part[j]=0;}return tot;}int main(){int i,j,k,m;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a+1,a+n+1,cmp);int sum=0;for(i=1;i<=n-1;i++)if(a[i].x<a[i+1].x && a[i].y==a[i+1].y)next[i]=i+1;printf("%d\n",dfs());return 0;}Ski Course Design
123456789101112131415161718192021222324252627282930313233using namespace std;const int maxn=1000+10,inf=1e9;int a[maxn];int main(){int i,j,k,n,m;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1);int Min=inf;for(i=a[1];i<=a[n]-17;i++){int tmp=0;j=1;while(a[j]<i){tmp+=(i-a[j])*(i-a[j]);j++;}j=n;while(a[j]-i>17){tmp+=(a[j]-i-17)*(a[j]-i-17);j--;}Min=min(tmp,Min);}printf("%d\n",Min);return 0;}Combination Lock
1234567891011121314151617181920212223242526272829303132using namespace std;const int maxn=100+1;bool p[maxn][maxn][maxn];int main(){int i,j,k,n,m;int sum=0;int x,y,z;scanf("%d",&n);scanf("%d%d%d",&x,&y,&z);for(i=-2;i<=2;i++)for(j=-2;j<=2;j++)for(k=-2;k<=2;k++)p[(x+n+i)%n][(y+n+j)%n][(z+n+k)%n]=1;scanf("%d%d%d",&x,&y,&z);for(i=-2;i<=2;i++)for(j=-2;j<=2;j++)for(k=-2;k<=2;k++)p[(x+n+i)%n][(y+n+j)%n][(z+n+k)%n]=1;for(i=0;i<n;i++)for(j=0;j<n;j++)for(k=0;k<n;k++)if(p[i][j][k])sum++;printf("%d\n",sum);return 0;}
USACO1.4
Arithmetic Progressions
123456789101112131415161718192021222324252627282930313233343536373839404142using namespace std;const int maxm=250,maxn=25+1;bool p[maxm*maxm*2+1];bool vis;int n,m,Max,tmp,a[maxm*maxm*2+1];void work(){int i,j;for(i=0;i<=m;i++)for(j=0;j<=m;j++){p[i*i+j*j]=1;if(i*i+j*j>Max) Max=i*i+j*j;}for(i=0;i<=Max;i++)if(p[i])a[++tmp]=i;return;}int main(){int i,j,k;scanf("%d%d",&n,&m);int a1,b;work();sort(a+1,a+n+1);for(b=1;b<=Max;b++)for(a1=1;a1<=tmp && b*(n-1)+a[a1]<=Max;a1++){for(k=1;k<n;k++)if(!p[a[a1]+b*k])break;if(k==n){printf("%d %d\n",a[a1],b);vis=1;}}if(!vis) puts("NONE");return 0;}
Mother’s Milk
123456789101112131415161718192021222324252627282930313233343536373839using namespace std;const int maxn=20+10;int vis[maxn][maxn],p[maxn];int max_a,max_b,max_c;void dfs(int x,int y,int z){if(x>max_a || y>max_b || z>max_c) return;if(x<0 || y<0 || z<0) return;if(vis[x][y]) return;vis[x][y]=1;if(x==0) p[z]=1;dfs(0,y+x,z);dfs(0,y,z+x);dfs(x-max_b+y,max_b,z);dfs(x-max_c+z,y,max_c);dfs(x+y,0,z);dfs(x,0,y+z);dfs(max_a,y-max_a+x,z);dfs(x,y-max_c+z,max_c);dfs(x+z,y,0);dfs(x,z+y,0);dfs(max_a,y,z-max_a+x);dfs(x,max_b,z-max_b+y);}int main(){int i,j,k,n,m;scanf("%d%d%d",&max_a,&max_b,&max_c);dfs(0,0,max_c);for(i=0;i<=20;i++)if(p[i])printf("%d ",i);putchar('\n');return 0;}
USACO1.5
Number Triangles
123456789101112131415161718192021222324252627using namespace std;const int maxn=1001,inf=-1e9;int f[maxn*maxn];int main(){int i,j,k,n,m;scanf("%d",&n);for(i=1;i<=n*(n-1)/2;i++)f[i]=inf;for(i=1;i<=n;i++)for(j=i*(i-1)/2+1;j<=i*(i+1)/2;j++){scanf("%d",&k);if(i==1) f[j]=k;if(j!=1) f[j]=max(f[j],k+f[j-i]);if(j!=i*(i+1)/2) f[j]=max(f[j],k+f[j-i+1]);}int Max=inf;for(i=n*(n-1)/2+1;i<=n*(n+1);i++)Max=max(Max,f[i]);printf("%d\n",Max);return 0;}Prime Palindromes
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657using namespace std;const int maxn=1000000+10;int a[11],num,n,m;int ans[maxn],tmp;void pd(){int i,sum=0;for(i=1;i<=(num+1)/2;i++)sum=sum*10+a[i];for(i=num/2;i>=1;i--)sum=sum*10+a[i];int x=(int)sqrt(sum);if(sum<n) return;if(sum>m) return;for(i=2;i<=x;i++)if(sum%i==0)return;ans[++tmp]=sum;}void work(int x){int i;if(x==0){pd();return;}for(i=0;i<=9;i++){a[x]=i;work(x-1);}}int main(){int i,j,k;scanf("%d%d",&n,&m);if(n<=2) puts("2");int x=n,y=m,xsum=0,ysum=0;while(x>0){x/=10;xsum++;}while(y>0){y/=10;ysum++;}for(i=xsum;i<=ysum;i++){num=i;work((i+1)/2);}sort(ans+1,ans+tmp+1);for(i=1;i<=tmp;i++)printf("%d\n",ans[i]);return 0;}
Superprime Rib
1234567891011121314151617181920212223242526272829303132333435using namespace std;int a[4]={2,3,5,7},sum=0;bool pd(){int i;int x=(int)sqrt(sum);for(i=2;i<=x;i++)if(sum%i==0)return false;return true;}void dfs(int x){int i;if(!pd()) return;if(x==0) printf("%d\n",sum);for(i=1;i<=9;i+=2){sum=sum*10+i;dfs(x-1);sum/=10;}}int main(){int i,j,k,n,m;scanf("%d",&n);for(i=0;i<4;i++){sum=a[i];dfs(n-1);}return 0;}