RocksonLee's Blog
avatar
RocksonLee
2022-04-01 14:51:38

Problem

Luogu

Codeforces

Solution

刚开始这道题的思考还有些问题。博弈?还是什么?

先观察样例看看先手怎么赢的?

石子数为:5 2 8,给出 3 就可以胜利

因为交互库会保证自己能赢,那这种情况是怎么必赢呢?

因为上一步加了 2 给 6,得到的 8 无法操作,所以他就只能对 小点 的两个数二选一咯。

那么我们需要构造一个等差数列,这个等差数列的最大数必须是上一个的操作过的。

先设一下三个数:分别为 abc,我们先对这个排个序,a < b < c

分类一下试试看?设我们输入的数为 x

如果操作在 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,那么 貌似没办法往下构造。

我们需要把 c 设置为最大的那个数即可!

那么我们在进行这个操作之前还需要把 c 作为最大的那个数,这貌似不难啊。

那么满足了这个条件后,后面一连串都可以完成,答案就迎刃而解了。

就搞一个极大值进去就好了!

于是这道题就写完了。

Code

#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;
}
CF 1375F Integer Game
comment评论
Search
search