2 条题解
-
2
周期计算版(比较节省时间)
using namespace std; int check(int a,int b) { if(a==b) return 0; if(a==0&&b==2|| a==0&&b==3|| a==1&&b==3|| a==2&&b==4|| a==3&&b==4|| a==1&&b==0|| a==2&&b==1|| a==3&&b==2|| a==4&&b==0|| a==4&&b==1) return 1; return -1; } int n,a,b,ansA,ansB,z;//总共要出几个拳、小A出拳、小B出拳、小A得分、小B得分、周期(a*b) int A[4005],B[4005];//a出拳和b出拳(总) /* 最大公因数 int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); } 最小公倍数 int lcm(int a,int b){ return a/gcd(a,b)*b; } */ //以上以后会讲 ,但是为了你们能看懂就先不用了。 int main() { cin>>n>>a>>b; z=lcm(a,b);//定义周期为最小公倍数(可能也不是最小,但我觉得这更容易) for(int i = 1;i<=a;i++) cin>>A[i]; for(int i = 1;i<=b;i++) cin>>B[i]; //一个周期内的出拳预处理出来 for(int i=a+1;i<=z;i++) A[i]=A[i-a]; for(int i=b+1;i<=z;i++) B[i]=B[i-b]; //记录最终答案 ansA = 0; ansB = 0; //整轮的处理 int oneA=0; //一轮z次周期A的加分 int oneB=0; //一轮z次的周期B的加分 for(int i = 1;i<=z;i++) { if(check(A[i],B[i])==1) oneA++; if(check(A[i],B[i])==-1) oneB++; } ansA+=(n/z)*oneA; ansB+=(n/z)*oneB; //剩下的处理 (多余的) for(int i = 1;i<=(n%z);i++) { if(check(A[i],B[i])==1) ansA++; if(check(A[i],B[i])==-1) ansB++; } cout<<ansA<<" "<<ansB<<"\n"; //最重要的输出 return 0; }
-
-2
11个判断
#include<bits/stdc++.h> using namespace std; //如果小A的出拳为a,小B的出拳为b //返回这场比赛的结果: //1:小A胜 //0:平局 //-1:小B胜 int check(int a,int b){ if(a==b) return 0; if(a==0&&b==2|| a==0&&b==3|| a==1&&b==3|| a==2&&b==4|| a==3&&b==4|| a==1&&b==0|| a==2&&b==1|| a==3&&b==2|| a==4&&b==0|| a==4&&b==1) return 1; return -1; } int n,a,b,ansA,ansB; int A[205],B[205]; int main() { cin>>n>>a>>b; for(int i=1;i<=a;i++) cin>>A[i]; A[0]=A[a]; for(int i=1;i<=b;i++) cin>>B[i]; B[0]=B[b]; ansA=0;//小A的最终得分 ansB=0;//小B的最终得分 for(int i=1;i<=n;i++) { //小A获胜 if(check(A[i%a],B[i%b])==1) { ansA+=1; ansB+=0; } //小B获胜 if(check(A[i%a],B[i%b])==-1) { ansA+=0; ansB+=1; } //平局 if(check(A[i%a],B[i%b])==0) { ansA+=0; ansB+=0; } } cout<<ansA<<" "<<ansB<<"\n"; return 0; }
打表判断每场比赛结果
#include<bits/stdc++.h> using namespace std; int f[5][5]={ 0, -1, 1, 1, -1, 0, 0, -1, 1, -1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }; int n,na,nb; int a[205],b[205]; int main() { cin>>n>>na>>nb; for(int i=0;i<na;i++){ cin>>a[i]; } for(int i=0;i<nb;i++){ cin>>b[i]; } int suma,sumb; suma=sumb=0; for(int i=0;i<n;i++){ int aa=a[i%na]; int bb=b[i%nb]; if(aa>bb){ if(f[bb][aa]>0){ sumb++; }else{ suma++; } }else if(aa<bb){ if(f[aa][bb]>0){ suma++; }else{ sumb++; } } //cout << i << " " << suma <<" "<<sumb<<endl; } cout << suma << " " << sumb <<endl; return 0; }
- 1
信息
- ID
- 148
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 48
- 已通过
- 24
- 上传者