#P1106A. 全都看见咯~(简单版)
全都看见咯~(简单版)
F. 全都看见咯~(简单版)
简单版和困难版的唯一区别是,在简单版中,。
题目描述
这是一道交互题。
在享用了芝士过后,纳西妲想和你玩一个经典游戏:取石子游戏。
游戏中有一堆石子,里面包含 个石子。游戏方式是两个人轮流抓石子,每次可以取走一定数量的石子;如果谁取走了最后的石子,那么他获得胜利。
作为智慧之神,纳西妲已经看到了所有的可能,所以总会选择最优的方案去取石子。虽然如此,聪明的你作为提瓦特的降临者,又是否看到了一种可以胜过纳西妲的方案呢?
注:在本题中,每次可以取走石子的数量会在数据中给出,用一个序列表示。举个例子,如果给定的数据为 ,那么就代表每次可以取走 或或个石子;如果为 ,就代表每次可以取走1或2或4个石子。
输入格式
第一行三个整数 , , ;
表示这堆石子的石子总数, 表示可以取走石子数量的种类数, 表示你是否是先手, 代表纳西妲是先手取石子, 代表你是先手取石子。
第二行 个整数,用空格隔开,代表可以取走石子数量的序列 。
序列中的每个数 ,序列中的数两两不相同。
在本题中保证 , , ;同时数据保证如果你按照最优方案去取石子,一定可以获得胜利。
交互方式
如果你需要进行一次取石子的操作,你 必须 输出一个序列 中的数字,代表你该轮要取的石子数量。
在一轮过程中,如果你是先手,那么在输出结束,并刷新缓冲区后,你可以从标准输入中读入纳西妲这一轮取的石子数;如果你是后手,那么你需要先从标准输入中读入纳西妲这一轮取的石子数,然后输出你的结果,并刷新缓冲区。
注意,在输出结束后,你 必须 刷新缓冲区。 例如,
- 在C++ 中你可以使用 fflush(stdout)。
- 在Java 中你可以使用 System.out.flush()。
- 在Pascal中你可以使用flush(output)
- 在Python中你可以使用 sys.stdout.flush()
样例输入
10 2 1
1 2
2
1
2
样例输出
1
1
2
1
数据范围及约定
测试点编号 | 约定 | 测试点分值 |
---|---|---|
每个测试点4分 | ||
每个测试点6分 |
C语言示例代码
#include <stdio.h>
int main()
{
int n, m, is_first;
scanf("%d%d%d", &n, &m, &is_first);
int a[10];
for(int i=0; i<m; i++)
scanf("%d", &a[i]);
// a[] = {1, 2};
int my_answer, na_answer;
// 由于本题一定是先手,所以无需再写纳西妲先手的情况
while(n)
{
my_answer = 1;
printf("%d\n", my_answer);
fflush(stdout); // 注意,不要忘记刷新缓冲区!
n -= my_answer;
if(!n) break;
scanf("%d", &na_answer);
n -= na_answer;
}
return 0;
}
C++示例代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, m, is_first;
cin >> n >> m >> is_first;
vector<int> a(m);
for(int i=0; i<m; i++)
cin >> a[i];
int my_answer, na_answer;
while(n)
{
my_answer = 1;
cout << my_answer << endl; // cout << endl 之后,会自动刷新缓冲区。
n -= my_answer;
if(!n) break;
cin >> na_answer;
n -= na_answer;
}
return 0;
}
python示例代码
import sys
n, m, is_first = map(int, input().split())
a = list(map(int, input().split()))
my_answer = 0
na_answer = 0
while n:
my_answer = 1
print(my_answer)
sys.stdout.flush()
n -= my_answer
if n == 0:
break
na_answer = int(input())
n -= na_answer
相关
在下列比赛中: