比赛地址Dashboard - Codeforces Round 876 (Div. 2) - Codeforces
A.有一个0 1序列 对于每个下标i,前i个位置和后i个位置必须有[i/k](上取整个数是1) 问1的最小数量。
显然 第一个和最后一个必须是1
那么我们考虑前n-1 个 保证每k个有一个就结束了
反正推导 后n-1个 也是同理 发现 没有区别
ans=ceil((n-1)/k)+1;
B.每个灯有2个属性 a和b 一开始灯全灭 你可以选择一个灯打开 你会获得b个积分 同时进行一次判断 如果你已经打开的灯的数量x 和灯的属性 存在a≤x的关系 所有属性a相同的灯就坏了 你不能再打开它 你需要找到最多的积分
这道题思路比较简单 但题目比较绕 即每个属性为a的灯你最多获得a个 那么每层让他获得a个就好了 不足a是最好的结果 下一层炸了没关系
for (int i = 1; i <= n; i++)
{
int a, b;
cin >> a >> b;
mp[a].emplace_back(b);
}
long long res = 0;
for (auto &[i, vec]: mp)
{
sort(vec.begin(), vec.end());
for (int j = vec.size() - 1, cnt = 1; j >= 0 && cnt <= i; j--, cnt++)
{
res += vec[j];
}
}
cout << res << endl;
}
C.直觉上 从后往前做 不细说了上code
for (int i = 1; i <= n; i++)
cin >> a[i];
if (a[n] == 1)
{
cout << "NO" << endl;
continue;
}
cout << "YES" << endl;
int cnt = 0;
for (int i = n; i; i--)
{
if (a[i]) cnt++;
if (a[i] && a[i - 1] == 0)
cout << cnt << " ", cnt = 0;
else
cout << 0 << " ";
}