Gym 100952I&&2015 HIAST Collegiate Programming Contest I. Mancala【模拟】
I. Mancala
Mancala is a traditional board game played in Africa, Middle East and Asia. It is played by two players. This game board consists of two rows of holes, one row for each player. Each row has N holes, and each hole has some non-negative number of stones.
The two players will, in turn, make a move. One move is described as follows:
- the player chooses one of the holes in his row and takes all the stones from it.
- he starts to put these stones one in each hole, starting from the next hole and moving in counter-clockwise order, until there are no more stones left in his hands.
player1's row: 2 2 3
player2's row: 1 8 2
if player2 starts a move and chooses the middle hole in his row(the one with 8 stones). The board after the move will be like:
player1's row: 3 3 5
player2's row: 2 1 4
you were playing a very important game with your best friend, when suddenly you had a phone call and moved your eyes of the game. Now you lost track of the game and you need to make sure if your friend made a valid move.
You are given the final board configuration and the place where the last stone landed, Your task is to check is your friend's move is invalid, and in case of a valid move, find the state of the board before that move.
You are player1 while your friend is player2.
The input consists of several test cases, each test case starts with three numbers n(1 ≤ n ≤ 10000) (the number of holes in each of the rows), r (1 ≤ r ≤ 2) and k (1 ≤ k ≤ n) (the row and hole number where the last stone was put, respectively). Then 2n numbers follow, ai :1 ≤ i ≤ n, and bj :1 ≤ j ≤ n, where ai is the number of stones in the i-th hole in your row. bj is the number of stones in the j-th hole in your friend's row. Initially given ai and bi satisfy that: (0 ≤ ai, bj ≤ 1000000000) while ai and bj are fit in 64 bits in the state of the board before the move (if there is a valid move).
The last test case is followed by three zeros.
For each test case display the case number followed by the word "INVALID" without the quotes if the move is invalid, or 2n numbers representing the original board configuration otherwise.
3 1 3
3 3 5
2 1 4
4 2 2
1 2 3 4
5 4 3 2
4 2 2
1 2 3 4
1 2 3 4
5 2 3
2 2 2 2 2
2 2 2 2 2
0 0 0
Case 1:
2 2 3
1 8 2
Case 2:
INVALID
Case 3:
0 1 2 3
9 0 2 3
Case 4:
0 0 0 0 0
0 0 20 0 0
题目链接:http://codeforces.com/gym/100952/problem/I
题目大意:
玩家1和玩家2玩一个游戏,每个人有n堆石子
游戏规则为:
玩家取自己的n堆石子中的一堆中全部石子,以顺时针顺序,每个石子堆放一个石子,直达全部放完。
注意:如果得到的答案是在第一行中,视为无效。
题目思路:
1.将石子堆化为一维
2.取其中最小的石子数为minnum,答案一定是在石子数为minnum的石子堆中。
3.判断哪一个最小值为答案,即,距离起点最近的那一个石子堆
以下是AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 inline ll read() 5 { 6 ll x=0,f=1; 7 char ch=getchar(); 8 while(ch<'0'||ch>'9') 9 { 10 if(ch=='-') 11 f=-1; 12 ch=getchar(); 13 } 14 while(ch>='0'&&ch<='9') 15 { 16 x=x*10+ch-'0'; 17 ch=getchar(); 18 } 19 return x*f; 20 } 21 inline void write(ll x) 22 { 23 if(x<0) 24 { 25 putchar('-'); 26 x=-x; 27 } 28 if(x>9) 29 write(x/10); 30 putchar(x%10+'0'); 31 } 32 const int N=100010; 33 ll num[N]; 34 vector<int>v; 35 #define INF 0x3f3f3f3f3f; 36 int main() 37 { 38 int tcase=1; 39 int n,r,c; 40 while(scanf("%d%d%d",&n,&r,&c)!=EOF) 41 { 42 if(n==0&&r==0&&c==0) 43 break; 44 v.clear(); 45 ll pos=0; 46 ll minnum=INF; 47 for(int i=1;i<=n;i++) 48 { 49 num[i]=read(); 50 minnum=min(minnum,num[i]); 51 } 52 for(int i=2*n;i>n;i--) 53 { 54 num[i]=read(); 55 minnum=min(minnum,num[i]); 56 } 57 for(int i=1;i<=2*n;i++) 58 { 59 if(num[i]==minnum) 60 v.push_back(i); 61 } 62 if(r==1) 63 pos=c; 64 else pos=2*n-c+1; 65 ll ans=minnum*2*n; 66 ll len=v.size(); 67 ll dis=INF; 68 for(int i=0;i<len;i++) 69 { 70 if(v[i]>=pos) 71 dis=min(dis,v[i]-pos); 72 else dis=min(dis,2*n-pos+v[i]); 73 } 74 int ed=(dis+pos)%(2*n); 75 if(ed==0) 76 ed=2*n; 77 printf("Case %d:\n",tcase++); 78 if(ed<=n) 79 cout<<"INVALID"<<endl; 80 else 81 { 82 for(int i=1;i<=2*n;i++) 83 num[i]-=minnum; 84 for(int i=pos;i<pos+dis;i++) 85 { 86 int ret=i%(2*n); 87 if(ret==0) 88 ret=2*n; 89 num[ret]--; 90 } 91 int ret=(pos+dis)%(2*n); 92 if(ret==0) 93 ret=2*n; 94 num[ret]=ans+dis; 95 cout<<num[1]; 96 for(int i=2;i<=n;i++) 97 cout<<" "<<num[i]; 98 cout<<endl; 99 cout<<num[2*n]; 100 for(int i=2*n-1;i>n;i--) 101 cout<<" "<<num[i]; 102 cout<<endl; 103 } 104 } 105 return 0; 106 }
作 者:Angel_Kitty
出 处:https://www.cnblogs.com/ECJTUACM-873284962/
关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
欢迎大家关注我的微信公众号IT老实人(IThonest),如果您觉得文章对您有很大的帮助,您可以考虑赏博主一杯咖啡以资鼓励,您的肯定将是我最大的动力。thx.
我的公众号是IT老实人(IThonest),一个有故事的公众号,欢迎大家来这里讨论,共同进步,不断学习才能不断进步。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码),个人QQ和微信的二维码也已给出,扫描下面👇的二维码一起来讨论吧!!!
欢迎大家关注我的Github,一些文章的备份和平常做的一些项目会存放在这里。