Codeforces 863C 模拟
来源:互联网 发布:微星显卡保修几年 淘宝 编辑:程序博客网 时间:2024/05/01 19:56
题意
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 LLusing 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); }}
阅读全文
0 0
- Codeforces 863C 模拟
- CodeForces 382C【模拟】
- Codeforces 749C【模拟】
- CodeForces 118C 【模拟】
- codeforces 864C 模拟
- 模拟-Codeforces 777C
- 二进制 模拟 codeforces 485C
- Codeforces 230C Shifts(模拟)
- Codeforces 651C Watchmen【模拟】
- CodeForces 350C Bombs(模拟)
- Codeforces-----233C---Cycles模拟
- 爆搜 + 模拟 --- codeforces 475C
- codeforces 591C (模拟)
- 模拟--Codeforces 665C(简单模拟)
- Codeforces 863D 模拟
- Codeforces 48C The Race 模拟题
- codeforces 460C - Present 二分加模拟
- codeforces--C - Anya and Ghosts(贪心+模拟)
- nginx安装
- python将list转为tuple
- 信号的频率谱与功率谱的区别
- poj1151 Atlantis(线段树+扫描线+离散化,求矩形面积并)
- servlet之文件上传
- Codeforces 863C 模拟
- 纳兰词赏析
- Spring data jpa + postgresql 项目中使用Lucene的简单介绍
- [BZOJ2064]分裂(状压dp)
- 第三方登录之支付宝
- 大端和小端
- OJ-单链表的逆置
- JVM学习总结
- 测试系列-移动端的埋点测试