1、110201/10038 Jolly Jumpers (快乐的跳跃者)
即相邻数字差的绝对值覆盖1~n-1,注意 单词 seccesive,take on
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<ctype.h> using namespace std; int arr[3005]; bool t[3005]; int main() { int n; while(scanf("%d",&n)!=EOF) { int i; for(i=0;i<n;i++) { scanf("%d",&arr[i]); } bool flag=true; memset(t,0,sizeof(t)); for(i=1;i<n;i++) { int f=abs(arr[i]-arr[i-1]); if(f>=1&&f<=n-1) { t[f]=1; } else { flag=false; break; } } for(i=1;i<n;i++) { if(t[i]==0) { flag=false; break; } } if(flag) printf("Jolly "); else printf("Not jolly "); } return 0; }
2、110202/10315 Poker Hands (扑克牌型)
此题为德州扑克,又名港式5张,相同类型比较时注意当相同张数>=3时,只比较相同张数的牌即可
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<ctype.h> using namespace std; char p1[5][5],p2[5][5]; char poker[20]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; int cnt[2][20]; int tot[20]; int dig[2][10]; int ans1[10][10]; int ans2[10][10]; int GetNum(char a) { int i; for(i=0;i<13;i++) { if(poker[i]==a)return i; } } bool cmp(int a,int b) { return a<b; } int GetType(char p[][5],int type) { int i; bool tf=true,df=true; dig[type][0]=GetNum(p[0][0]); for(i=1;i<5;i++) { dig[type][i]=GetNum(p[i][0]); if(p[i][1]!=p[i-1][1]) { tf=false; } } sort(dig[type],dig[type]+5,cmp); for(i=1;i<5;i++) { if(dig[type][i]!=dig[type][i-1]+1) { df=false; break; } } if(tf&&df)return 1; if(tf)return 4; if(df)return 5; memset(cnt,0,sizeof(cnt)); memset(tot,0,sizeof(tot)); for(i=0;i<5;i++) { cnt[type][dig[type][i]]++; } for(i=0;i<13;i++) { tot[cnt[type][i]]++; } if(tot[4]==1)return 2; if(tot[3]==1&&tot[2]==1)return 3; if(tot[3]==1)return 6; if(tot[2]==2)return 7; if(tot[2]==1)return 8; return 9; } void fun(int ans[][10],int type) { int i,j; for(i=0;i<10;i++) for(j=0;j<10;j++)ans[i][j]=-1; memset(tot,0,sizeof(tot)); for(i=0;i<5;i++) { tot[dig[type][i]]++; } int cnt=0; for(i=12;i>=0;i--) { if(tot[i]!=0) { cnt+=tot[i]; if(ans[tot[i]][0]==-1) ans[tot[i]][0]=1; else ans[tot[i]][0]++; int t=ans[tot[i]][0]; ans[tot[i]][t]=i; if(cnt==5) return; } } } int main() { int i=0,j; while(scanf("%s",p1[0])!=EOF) { for(i=1;i<5;i++)scanf("%s",p1[i]); for(i=0;i<5;i++)scanf("%s",p2[i]); int t1=GetType(p1,0); int t2=GetType(p2,1); int W=-1; if(t1<t2)printf("Black wins. "); else if(t1>t2)printf("White wins. "); else { fun(ans1,0); fun(ans2,1); bool find=false; for(i=5;i>=1&&!find;i--) { if(ans1[i][0]!=-1&&ans2[i][0]!=-1) { for(j=1;j<=ans1[i][0];j++) { if(ans1[i][j]>ans2[i][j]) { W=0; find=true; break; } else if(ans1[i][j]<ans2[i][j]) { W=1; find=true; break; } } if(i>=3)break; } } if(W==0)printf("Black wins. "); else if(W==1)printf("White wins. "); else printf("Tie. "); } } return 0; } /* 3H 3D 3S 9C KD 5C 5H 5S 5C 9H 7H 3H 4H 5H 6H 2S 3S 4S 5S 6S 6H 2D 4S 9C KD 6C 3H 4S 9C KH */
3、110203/10050 Hartals (罢工)
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<ctype.h> using namespace std; int cnt[4000]; int h[105]; int main() { int T; scanf("%d",&T); while(T--) { memset(cnt,0,sizeof(cnt)); int i,j,p,N; scanf("%d",&N); scanf("%d",&p); for(i=0;i<p;i++) { scanf("%d",&h[i]); } for(i=0;i<p;i++) { j=h[i]; while(j<=N) { cnt[j]++; j+=h[i]; } } int tot=0; for(j=1;j<=N;j++) { int t=j%7; if(t!=6&&t!=0) { if(cnt[j]!=0) tot++; } } printf("%d ",tot); } return 0; }
4、110204/843 Crypt Kicker (解密)
非递归方式,需要考虑很多情况
将单词按长度分类链接,若密文找不到匹配的单词则需要回溯
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<ctype.h> using namespace std; char word[1005][20]; int nxt[1005]; int h[20]; int cur[85]; char lin[85][20]; int ch[85]; char alp[100]; int lett[100][20]; int vis[100]; int _alp[100]; int _vis[100]; void Read(int n) { int i; memset(h,-1,sizeof(h)); memset(nxt,-1,sizeof(nxt)); char tmp[100]; for(i=0;i<n;i++) { gets(word[i]); int len=strlen(word[i]); nxt[i]=h[len]; h[len]=i; } } void fun() { char tmp[100]; while(gets(tmp)!=NULL) { int i,j,len=strlen(tmp),k=0,m=0,c,b; for(i=0;i<=len;i++) { if(tmp[i]==' '&&k==0)continue; if((tmp[i]==' '||i==len)&&k!=0) { lin[m][k]='