刚开始这道题的思考还有些问题。博弈?还是什么?
先观察样例看看先手怎么赢的?
石子数为:5 2 8,给出 3 就可以胜利
因为交互库会保证自己能赢,那这种情况是怎么必赢呢?
因为上一步加了 2 给 6,得到的 8 无法操作,所以他就只能对 小点 的两个数二选一咯。
那么我们需要构造一个等差数列,这个等差数列的最大数必须是上一个的操作过的。
先设一下三个数:分别为
,
,
,我们先对这个排个序,
。
分类一下试试看?设我们输入的数为
。
如果操作在
,那么
a ,故
b < c < a+x ,即
a+x+b=2c 。 如果操作在
x=2c-a-b ,那么
b ,故
a < c < b+x ,即
a+x+b=2c 。 如果操作在
x=2c-a-b ,那么 貌似没办法往下构造。
c
我们需要把
设置为最大的那个数即可!
那么我们在进行这个操作之前还需要把
作为最大的那个数,这貌似不难啊。
那么满足了这个条件后,后面一连串都可以完成,答案就迎刃而解了。
就搞一个极大值进去就好了!
于是这道题就写完了。
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define INF 1e11
#define cl(a, b) memset(a, b, sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
int main()
{
ll a[10], qwq = INF, temp1, temp2;
cin >> a[1] >> a[2] >> a[3];
cout << "First" << endl;
cout << qwq << endl;
fflush(stdout);
cin >> temp1;
a[temp1] += qwq;
qwq = 3 * a[temp1] - a[3] - a[2] - a[1];
cout << qwq << endl;
fflush(stdout);
cin >> temp2;
a[temp2] += qwq;
qwq = a[temp1] - a[6 - temp1 - temp2];
cout << qwq << endl;
fflush(stdout);
return 0;
}