Gym 100952I&&2015 HIAST Collegiate Programming Contest I. Mancala【模拟】
I. Mancala
time limit per test:3 seconds
memory limit per test:256 megabytes
input:standard input
output:standard output
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.
eg: given this board:
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.
Input
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.
Output
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.
Examples
Input
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
Output
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 }
- 关于RBAC(Role-Base Access Control)的理解
- Spring Boot 中使用 Kafka
- 如何评价一段代码
- java系统高并发的解决方案
- Spring Boot 中使用 Redis
- 使用 Jedis 连接操作 Redis
- 浅析ReDoS的原理与实践
- 使用 Executors,ThreadPoolExecutor,创建线程池,源码分析理解
- CentOS+Nginx+Tomcat搭建高性能负载均衡集群
- Java 四种线程池的使用
- 搭建 Jenkins-2.83 服务,部署 spring boot 项目
- Spring Boot 中使用 Java API 调用 lucene
- Spring Boot 中使用 Java API 调用 Elasticsearch
- Spring Boot 中使用 公共配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数据库PostrageSQL-服务器配置(复制)
- 高可用服务解决方案(DBA).md
- dotnet 使用 Interlocked 实现一个无锁的快速无序仅写集合
- 利用Python将gff3转换成gtf格式
- 单细胞DoHeatmap画热图标签出界
- FastSpar | 用更快的 SparCC 进行微生物组相关性分析
- GO和KEGG富集倍数(Fold Enrichment)如何计算
- 监控域名HTTPS证书过期时间
- 使用hmmlearn分析股票数据
- Flink源码阅读之Checkpoint执行过程
- 一文了解Kudu的核心原理
- 回归问题的中的常用方法
- 深度优先搜索(DFS)两点之间的可行路径
- docker相关工具
- Dijkstra算法求图中最短路径