Codeforces 863C 模拟
2017-09-23 19:31
453 查看
题意
Alice和Bob玩一个游戏,2比1大,3比2大,1比3大。最开始两个人选择a和b,随后进行k次游戏,每一次每个人选择的数字由一个矩阵决定。如果上一回合A选择了a,B选择了b,那么A这一回合选择A矩阵里的(a,b)元素,B这一回合选择B矩阵里的(a,b)元素。问A,B能赢多少次。题解
我们可以看出来,A和B选择的a和b一定是循环的,因此我们可以写一段代码去找出这个循环节。然后对于循环节前后的元素特殊处理,对于中间部分的元素直接用循环节数量*Win的次数。代码
#include<bits/stdc++.h> #define LL long long #define UP(i,l,h) for(int i=l;i<h;i++) #define DOWN(i,h,l) for(int i=h-1;i>=l;i--) #define W(t) while(t) #define INF 0x3f3f3f3f #define MEM(a,b) memset(a,b,sizeof(a)) #define MAXN 200010 #define int LL using namespace std; typedef pair<int,int> P; int ma[4][4],mb[4][4]; map<P,int> mp; int dp[1010][2]; int check(int a,int b){ if(a==1&&b==3){ return 1; }else if(a==2&&b==1){ return 1; }else if(a==3&&b==2){ return 1; }else if(a==b){ return 0; }else return 2; } main(){ int k,a,b; scanf("%I64d%I64d%I64d",&k,&a,&b); UP(i,1,4) UP(j,1,4) scanf("%I64d",&ma[i][j]); UP(i,1,4) UP(j,1,4) scanf("%I64d",&mb[i][j]); MEM(dp,0); int cnt=1; W(true){ dp[cnt][0]=dp[cnt-1][0]; dp[cnt][1]=dp[cnt-1][1]; // cout<<"ck"<<a<<" "<<b<<" "<<check(a,b)<<endl; if(check(a,b)==1){ dp[cnt][0]++; }else if(check(a,b)==2){ dp[cnt][1]++; } if(mp[P(a,b)]==0){ mp[P(a,b)]=cnt++; }else break; int tmpa=a,tmpb=b; a=ma[tmpa][tmpb],b=mb[tmpa][tmpb]; } int len=cnt-mp[P(a,b)]; // cout<<cnt<<" "<<mp[P(a,b)]<<endl; if(k<cnt){ printf("%I64d %I64d\n",dp[k][0],dp[k][1]); }else{ int wina=dp[cnt-1][0]-dp[mp[P(a,b)]-1][0]; int winb=dp[cnt-1][1]-dp[mp[P(a,b)]-1][1]; int sa=dp[mp[P(a,b)]-1][0],sb=dp[mp[P(a,b)]-1][1]; // cout<<sa<<" "<<sb<<" "<<mp[P(a,b)]-1<<" "<<k<<endl; k-=(mp[P(a,b)]-1); int num=k/len; k-=num*len; sa+=wina*num; sb+=winb*num; // cout<<sa<<" "<<sb<<" "<<k<<endl; int now=mp[P(a,b)]; W(k){ // cout<<now<<" "<<dp[now][0]-dp[now-1][0]<<" now "<<dp[now][1]-dp[now-1][1]<<endl; sa+=dp[now][0]-dp[now-1][0]; sb+=dp[now][1]-dp[now-1][1]; k--; now++; } printf("%I64d %I64d\n",sa,sb); } }
相关文章推荐
- CodeForces - 141A Amusing Joke (模拟)水
- Codeforces 746E Numbers Exchange 模拟
- 【Codeforces】66A - Petya and Java(模拟)
- CodeForces - 868B Race Against Time(模拟)
- CodeForces 545D Queue (排序模拟)
- Codeforces 475C Kamal-ol-molk's Painting 模拟
- CodeForces 677B Vanya and Food Processor(打土豆,模拟)
- CodeForces 321A Ciel and Robot(模拟)
- Codeforces 549D Haar Features (模拟)
- codeforces 746C 模拟
- CodeForces 1B (模拟 + excel的行列表示转换 )
- Codeforces 586C Gennady the Dentist 模拟
- CodeForces - 858C【贪心+模拟】
- 【CodeForces 779A】Pupils Redistribution(模拟)
- Codeforces 631B Print Check【模拟】
- Codeforces 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest I题(模拟)
- Codeforces 472B - Design Tutorial: Learn from Life(模拟)
- Codeforces 381A Sereja and Dima(模拟)
- CodeForces 731B-Coupons and Discounts(贪心 模拟)
- CodeForces 435C Cardiogram-模拟