和
如果
可以证明,在给定的约束条件下,解总是存在的。
输入
输入的第一行包含一个整数
每个测试用例由一行组成,包含两个整数
保证所有测试用例中
首先数据范围
首先想到本题最终和
如果没有
那么首先第一点,
这一项
此时,序列会空余出区间
区间补充
接下来是重点。
问题解决了么?
还没有。
对于目标数
对于
如何填补被挖去的
所以还需要补充
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(nullptr); \
cout.tie(nullptr);
void solve()
{
int n, k;
>> n >> k;
cin <int> a;
vectorint log = __lg(k);
int sum = 0;
for (int i = 0; i < log; i++)
{
.push_back(1LL << i);
a+= 1LL << i;
sum }
if (k - 1 - sum)
.push_back(k - 1 - sum);
a= k - 1;
sum .push_back(k + 1);
a.push_back(k + 1 + (1LL << log));
awhile (a.size() < 25)
{
++;
log.push_back((1LL << log));
a}
<< 25 << endl;
cout for (auto p : a)
{
<< p << " ";
cout }
<< endl;
cout }
signed main()
{
int t;
>> t;
cin while (t--)
{
();
solve}
("pause");
systemreturn 0;
}
爱丽丝和鲍勃正在玩一个关于
既然爱丽丝先下,如果双方都以最佳方式下棋,谁会赢得比赛?
如果只有一堆石子,那么
进一步的说,如果能够控制最后一对石子是自己先手,那么可以做到这一点的人必胜。
同理,可以简单推理出相同个数的石子堆不具有影响答案的能力,可以视作
考虑先手必胜,如果有
所以对于最少有
问题在于如果先手操作过程中导致了自己下一次拿只能拿一个丢了先手权如何处理。
设当前最少得石子堆为
如果先手拿
那么此时先手可以直接拿走
也就是说,率先面对当前操作的石子堆石子个数
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n;
>> n;
cin <int> s;
setfor (int i = 1; i <= n; i++)
{
int u;
>> u;
cin .insert(u);
s}
int size = s.size();
if (size == 1)
{
<< "Alice" << endl;
cout return;
}
bool flag = 0;
int cnt = 0;
while (!s.empty())
{
int top = *s.begin();
if (top == cnt + 1)
{
^= 1;
flag = top;
cnt .erase(top);
s}
else
break;
}
if (s.empty())
{
if (flag)
<< "Alice" << endl;
cout else
<< "Bob" << endl;
cout }
else
{
if (flag)
<< "Bob" << endl;
cout else
<< "Alice" << endl;
cout }
}
int main()
{
int t;
>> t;
cin while (t--)
{
();
solve}
("pause");
systemreturn 0;
}
请我喝杯咖啡吧~