A Difference Operations(思维,直觉)
Description:
给出数组a,对于 i (2 <= i <= n) 可以执行ai = ai - a_i-1的操作
请问是否能让(2 <= i <= n) 的ai 清零
Solution:
是a1的倍数的才能被清为0,秒切
Code:
void solve()
{
cin >> n;
int x;
cin >> x;
bool ok = true;
for(int i = 1; i < n; i ++)
{
int xx;
cin >> xx;
if(xx % x != 0)
ok = false;
}
if(ok)
cout << "YES\n";
else
cout << "NO\n";
}
B Difference of GCDs(思维,构造)
Description:
给出n,和区间[l, r]。你需要构造出一个序列ai (1 <= i <= n) 使得gcd(i, ai)各不相同
若有解,输出YES和序列a,无解输出NO
Solution:
由于i的取值是[1, n],所以gcd若是结果不同的话,一定是分布在[1, n]( gcd(a, b) <= min(a, b) )
既然是这样分布,我们不如直接令gcd(i, ai) == i,因为ai没有说不能取重复的,所以直接对于每个i去[l, r]里找i的第一个倍数即可
Code:
int n;
LL l, r;
void solve()
{
cin >> n >> l >> r;
vector<LL> res;
for(int i = 1; i <= n; i ++)
{
LL st = i * ((l + i - 1) / i); //上取整
if(st > r)
{
cout << "NO\n";
return;
}
else
res.pb(st);
}
cout << "YES\n";
for(auto x : res)
cout << x << ' ';
cout << '\n';
}
C Doremy’s IQ(贪心,猜结论)
Description:
有n场比赛和起始智商q,依次决定是否参加第i场比赛,若参加第i场比赛且q < ai的时候,q –
只有q > 0的时候,可以参与比赛
输出一个01串,1表示参加该场比赛,要求串中的1尽可能多
Solution:
一开始觉得是DP,但是发现DP不能存下q(q = 1e9)这个状态表示,认为是贪心但是没有想到策略。
赛后看了大佬的题解,是我猜测过的情况,但我没办法说服自己那是对的。下次积极WA着去尝试
6 4
5 4 4 4 4 4
通过该样例我们发现,正序遍历是一定得不到正解的。需要考虑倒着来考虑。
可以贪心地想到,在结尾的时候正好把q花光,并且仅可能地参加比赛。那么问题就变成了什么时候选择参加比赛。
倒着来看,若当前位置q_now < a_i,在当前位置参加比赛并使q_now ++,这样的话我们就保证了后面全部取了,当前q_now已经为最佳策略。
Code:
const int N = 100005;
int n, q;
int a[N];
int res[N];
void solve()
{
memset(res, 0, sizeof res);
cin >> n >> q;
for(int i = 1; i <= n; i ++)
cin >> a[i];
int cur = 0;
for(int i = n; i >= 1; i --)
{
if(cur >= a[i])
res[i] = 1;
else if(cur < q)
cur ++, res[i] = 1;
}
for(int i = 1; i <= n; i ++)
cout << res[i];
cout << '\n';
}