比赛链接:https://codeforces.com/contest/1342

A - Road To Zero

题意

有两个非负整数 x, y 以及两种操作:

  • 支付 a 点代价使其中一个数加一或减一
  • 支付 b 点代价使两个数都加一或减一

问使二者为 0 的最小代价。

思路

把较大的数减至与较小数相等再选取 min(2 * a, b) 把二者减为 0 即可。

代码

#include <bits/stdc++.h>
using namespace std; void solve() {
long long x, y, a, b; cin >> x >> y >> a >> b;
cout << min(2 * a, b) * min(x, y) + a * (max(x, y) - min(x, y)) << "\n";
} int main() {
int t; cin >> t;
while (t--) solve();
}

B - Binary Period

题意

给定 01 串 t,构造 01 串 s,要求满足:

  • 长度不超过 2 * | t |
  • t 为 s 的一个子序列
  • s 由最短的字符串重复而成

思路

如果 t 中只含有一种字符直接输出 t 即可,否则对于 t 中的每位均用“01”代替。

代码

#include <bits/stdc++.h>
using namespace std; void solve() {
string t; cin >> t;
int zero = 0, one = 0;
for (char c : t)
if (c == '0') zero = 1;
else one = 1;
if (zero + one == 1) cout << t << "\n";
else {
for (int i = 0; i < t.size(); i++)
cout << "01";
cout << "\n";
}
} int main() {
int t; cin >> t;
while (t--) solve();
}

C - Yet Another Counting Problem

题意

给你两个正整数 a, b,回答 q 次询问:[l, r] 区间中有多少数 x % a % b != x % b % a 。

思路

观察到条件为 x % a % b != x % b % a,可以联想到 (x + lcm(a, b)) % a % b != (x + lcm(a, b)) % b % a ,所以只需计算 [1, lcm] 区间内满足条件的数的个数,然后计算 [1, l - 1], [1, r] 中各有多少个长为 lcm 的区间,考虑到可能有不完全包含区间,所以可以计算 [1, lcm] 内的前缀和,查询长度对 lcm 取余对应的前缀和即为不完全包含区间中满足条件的数的个数。

代码

#include <bits/stdc++.h>
using LL = long long;
using namespace std; void solve() {
int a, b, q; cin >> a >> b >> q;
int lcm = a * b / __gcd(a, b);
int cnt[lcm + 1] = {};
for (int i = 1; i <= lcm; i++) {
cnt[i] = cnt[i - 1] + (i % a % b != i % b % a);
}
auto f = [&] (LL n) -> LL {
return cnt[lcm] * (n / lcm) + cnt[n % lcm];
};
for (int i = 0; i < q; i++) {
LL l, r; cin >> l >> r;
cout << f(r) - f(l - 1) << " \n"[i == q - 1];
}
} int main() {
int t; cin >> t;
while (t--) solve();
}

D - Multiple Testcases

题意

将 n 个数分为尽可能少的数组,要求每个数组中大于等于 i 的数不超过 ci 个。

思路

一种较为简便的方法是:利用后缀和算出大于等于 i 的数共有多少个,最少需要的数组即为 $max \lceil \frac{n_i}{c_i} \rceil$,之后从小到大循环推入数组元素。但是这种贪心的原理仍有待证明。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
int n, k; cin >> n >> k;
int suf[k + 1] = {};
int m[n]; for (int &i : m) cin >> i, ++suf[i - 1];
int c[k]; for (int &i : c) cin >> i;
int ans = 0;
for (int i = k - 1; i >= 0; i--) {
suf[i] += suf[i + 1];
ans = max(ans, (suf[i] - 1) / c[i] + 1);
}
vector<int> vec[ans];
sort(m, m + n);
for (int i = 0; i < n; i++)
vec[i % ans].push_back(m[i]);
cout << ans << "\n";
for (auto v : vec) {
cout << v.size();
for (auto i : v) cout << ' ' << i;
cout << "\n";
}
}

最新文章

  1. Jenkins学习二:Jenkins安装与配置
  2. ServletContext读取Web应用中的资源文件
  3. on-my-zsh agnoster 主题设置问题
  4. 实战:ADFS3.0单点登录系列-总览
  5. Java初学(五)
  6. HDU 4539 郑厂长系列故事――排兵布阵(曼哈顿距离)
  7. mbed OS - ARM关于物联网(IoT)的战略布局
  8. Odwiedziny[POI 2015]
  9. pyqt5 QGraphicsView颜色动画问题(不兼容,运行不了动画)
  10. nginx代理 (带着请求头)
  11. jquery学习总结24-36
  12. java 静态变量 静态代码块 加载顺序问题
  13. Reference-TMB
  14. postgres密码修改
  15. GO数组
  16. golang类型判断
  17. Linux内核Socket参数调优
  18. 协程实现多并发socket,跟NGINX一样
  19. 专访Nick McKeown:网络领域的游戏颠覆者
  20. Spring Boot 学习系列(08)—自定义servlet、filter及listener

热门文章

  1. AttGAN: Facial Attribute Editing by Only Changing What You Want 论文阅读笔记和AttGan的pytorch代码实现
  2. git revert 回退已经push的内容
  3. MySQL select if 查询最后一个主键 id
  4. EF Core 6.0的新计划
  5. 训练分类器 - 基于 PyTorch
  6. ubuntu20.04并添加桌面快捷方式,以安装火狐可浏览器开发版(水狐)为例
  7. 被集群节点负载不均所困扰?TKE 重磅推出全链路调度解决方案
  8. 【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
  9. SharePoint Online 站点模板中权限的设置
  10. 2021/1/20随记,MTU