「AOJ2031~2040」の編集履歴(バックアップ)一覧に戻る
#include<stdio.h> #include<string> #include<map> #include<set> #include<iostream> std::string text[15]={"Rock","Fire","Scissors","Snake","Human","Tree","Wolf","Sponge","Paper","Air","Water","Dragon","Devil","Lightning","Gun"}; std::map<std::string,int> toNum; void check(int n){ int hit[15]={0}; std::string str; for(int i=0;i<n;i++){ std::cin>>str; hit[toNum[str]]=1; } int sum=0; for(int i=0;i<15;i++){ sum+=hit[i]; } if(sum==1){ printf("Draw\n"); return ; } for(int i=0;i<15;i++){ if(hit[i]==0)continue; bool ok=true; for(int j=1;j<=7;j++){ if(hit[(i+15-j)%15]==1){ ok=false; } } if(ok==true){ std::cout<<text[i]<<"\n"; return ; } } printf("Draw\n"); } int main(){ for(int i=0;i<15;i++){ toNum[text[i]]=i; } int n; while(1){ scanf("%d",&n); if(n==0)break; check(n); } }
#include<stdio.h> #include<vector> #include<algorithm> #include<string.h> const int up=30010; std::vector<int> sosuu; bool so[up+1]; void setSo(){ int i2; memset(so,true,sizeof(so)); so[0]=so[1]=false; for(int i=4;i<=up;i+=2)so[i]=false; sosuu.push_back(2); for(int i=3;i<=up;i+=2){ if(so[i]==false)continue; sosuu.push_back(i); i2=i*2; for(int j=i*3;j<=up;j+=i2){ so[j]=false; } } } int table[up]={0}; int main(){ setSo(); std::vector<int>::iterator itA,itB,itC,itU; for(itA=sosuu.begin();itA!=sosuu.end();itA++){ int a=(*itA); for(itB=itA;itB!=sosuu.end();itB++){ int b=(*itB); itU=std::lower_bound(sosuu.begin(),sosuu.end(),b+a); for(itC=itB;itC!=itU;itC++){ int c=(*itC); if(a+b+c>=up||a+b<=c)break; table[a+b+c]++; } } } int t; while(1){ scanf("%d",&t); if(t==0)break; printf("%d\n",table[t]); } }