A

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; int cnt[107];
bool solve() {
int n;
cin >> n;
for (int i = 0;i < 100;i++) cnt[i] = 0;
for (int i = 1, x;i <= n;i++) cin >> x, cnt[x]++;
for (int i = 1;i < 100;i++) if (cnt[i - 1] < cnt[i]) return false;
cout << "YES" << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "NO" << '\n';
}
return 0;
}

B

题目

有 \(k\) 个金块,每个价值 \(g\) 个银币,共价值 \(kg\) 个银币。

有 \(n\) 个人要分这 \(kg\) 个银币,分的方案是按照银币分的,但金块只能完整的给。

因此,若分到的 \(x\) 个银币,根据余数 \(r = x \bmod g\) 分类:

  1. 若 \(r \geq \left\lceil \dfrac{g}{2} \right\rceil\) ,那么将会分到 \(x - r + g\) 。
  2. 否则,将会分到 \(x-r\) 。

给出使得保留银币最多的方案。

题解

知识点:数学,贪心。

贪心地给每个人先分 \(\left\lceil \dfrac{g}{2} \right\rceil - 1\) 个银币,这样使得每个人不会获得的部分是最多的。

接下来,分剩下的 \(kg - n\left(\left\lceil \dfrac{g}{2} \right\rceil - 1\right)\) (若还有)。因为一开始已经给所有人分了不会获得的上限,因此对于任意一个人,只要多一个银币就会多分一个金,所以最后实际会分到 \(g \left\lceil \dfrac{kg - n \left( \left\lceil \dfrac{g}{2} \right\rceil - 1 \right)}{g} \right\rceil\) 个银币,剩下的就是保留下来的。

时间复杂度 \(O(1)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; bool solve() {
ll n, k, g;
cin >> n >> k >> g;
cout << k * g - (max(0LL, k * g - ((g + 1) / 2 - 1) * n) + g - 1) / g * g << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

C

题目

给出三个数 \(a,b,c\) 的位数 \(A,B,C\) ,需要构造这三个数(无前导 \(0\) ),使得满足等式 \(a+b=c\) 。

求出所有能构造出来的等式中,字典序第 \(k\) 小的等式。

题解

知识点:数学,枚举,贪心。

因为数字位数是固定的,那么字典序第 \(k\) 小就等价于按 \(a,b,c\) 为第一、二、三关键字从小到大排序后的第 \(k\) 个等式。因此,我们可以从小到大枚举 \(a\) ,判断以当前 \(a\) 构造的所有等式是否包含了第 \(k\) 个等式,若包含则构造出 \(b,c\) 即可。

现在问题变为,如何求出一个 \(a\) 能构造出多少等式。将原式变形为 \(b = c - a\) ,满足这个等式的 \(b,c\) 对的个数即为等式数量,那就是取 \([10^{B-1},10^B-1]\) 与 \([10^{C-1}-a,10^C-1-a]\) 的交集的长度。若交集不存在,则这个 \(a\) 没有有效等式,跳过即可。

当然,其实交集不存在有两种情况,一种是 \(b\) 在 \(c\) 左边,这种情况跳过这个 \(a\) 即可;一种是 \(b\) 在 \(c\) 右边,这种情况其实可以直接判断不存在,因为 \(a\) 往后会更大,\(c\) 的区间会继续往左,不可能产生交集。实际上,我们都选择跳过而不判断不存在,是没有任何影响的。

时间复杂度 \(O(10^A)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; const int p[7] = { 1,10,100,1000,10000,100000,1000000 };
bool solve() {
int a, b, c;
ll k;
cin >> a >> b >> c >> k;
ll sum = 0;
for (int i = p[a - 1];i < p[a];i++) {
int l = max(p[b - 1], p[c - 1] - i);
int r = min(p[b] - 1, p[c] - 1 - i);
if (l > r) continue;
int len = r - l + 1;
if (sum + len >= k) {
cout << i << " + " << k - sum - 1 + l << " = " << i + k - sum - 1 + l << '\n';
return true;
}
sum += len;
}
return false;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

D

题目

有 \(n\) 个人抽奖编号为 \(1\) 到 \(n\) ,每个人从 \([0,m]\) 选取一个整数作为自己的号码 \(a_i\) 。

中奖号码随机从 \([0,m]\) 种选取,最接近的 \(k\) 个人获奖。若出现一群人距离相同,但超人数了,那么编号较小的人获奖。

现在你的编号是 \(n+1\) 也想参与抽奖,你知道 \(n\) 个人选了的号码,想要在在 \([0,m]\) 中选一个号码使得自己的获奖概率最大。

因此,求出最多能有多少种中奖号码能使得你获奖,并给出这种情况你要选择的最小号码。

题解

知识点:数学,二分,枚举。

我们先对 \(a\) 从小到大排序,方便查找。

考虑对于一个号码 \(x\) ,有多少种中奖号码能使得 \(x\) 获奖。显然,中奖号码是一个连续的区间。

我们不妨考虑其左端点的位置,左端点是由于与从 \(x\) 往左数第 \(k\) 个人竞争第 \(k\) 个获奖位置导致的。我们假设大于 \(x\) 的第一个位置在 \(p\) ,那么左数第 \(k\) 个人应该在 \(p - k\) ,因此左端点为 \(\left\lfloor \dfrac{x + a_{p-k}}{2} \right\rfloor + 1\) (因为我们的编号最大,所以左端点必须严格靠近 \(x\) ),所以到左端点的中奖号码有 \(x - \left( \left\lfloor \dfrac{x + a_{p-k}}{2} \right\rfloor + 1 \right) + 1= \left\lceil \dfrac{x - a_{p-k}}{2} \right\rceil\) 个。

右端点同理,我们假设大于等于 \(x\) 的第一个位置在 \(p\) ,同时 \(x\) 在算左端点的时候算进去了,因此到右端点中奖号码有 \(\max\left(0, \left\lceil \dfrac{a_{p+k-1}-x}{2} \right\rceil - 1 \right)\) 个。

当然,如果左右人数不够 \(k\) 个,可以直接加到底。

接下来,显然我们是不能 \([0,m]\) 一个一个枚举的,实际上我们只需要枚举 \(a_i\) 以及 \(a_i-2,a_i-1,a_i+1,a_i+2\) 。因为可以发现,两个号码中间的位置答案其实基本是一样的,但需要分奇偶,因此考虑左右两边各两个以及号码本身。同时,要考虑所有人都能获奖的情况, \(0\) 也是答案,即使它不在 \(a_i\) 里,因此一开始直接判 \(0\) 即可。

时间复杂度 \(O(n \log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; ll a[1000007];
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, k;
ll m;
cin >> n >> m >> k;
for (int i = 1;i <= n;i++) cin >> a[i];
sort(a + 1, a + n + 1); ll mx = 0, ans = 0; auto check = [&](ll x) {
int low = lower_bound(a + 1, a + n + 1, x) - a;
int up = upper_bound(a + 1, a + n + 1, x) - a; ll win = 0;
if (up - k <= 0) win += x + 1;
else win += (x - a[up - k] + 1) / 2; if (low + k - 1 > n) win += m - x;
else win += max(0LL, (a[low + k - 1] - x + 1) / 2 - 1); if (win > mx) {
mx = win;
ans = x;
}
}; check(0);
for (int i = 1;i <= n;i++) {
if (a[i] - 2 >= 0) check(a[i] - 2);
if (a[i] - 1 >= 0) check(a[i] - 1);
check(a[i]);
if (a[i] + 1 <= m) check(a[i] + 1);
if (a[i] + 2 <= m) check(a[i] + 2);
}
cout << mx << ' ' << ans << '\n';
return 0;
}

Codeforces Round #880 (Div. 2) A-D的更多相关文章

  1. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  7. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

  10. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

随机推荐

  1. windows10设置共享目录

    win10设置目录局域网内共享 1.右键点击文件属性,点击共享 2.选择与其共享的用户 3.点击共享,选择everyone,可以让在同一局域网下的用户访问 4.显示你的文件夹已共享 5.在同一局域网的 ...

  2. MySQL(四)用户与权限管理

    用户与权限管理 用户管理 MySQL用户分为普通用户和root用户,提供了许多语句来管理包括登录.退出MySQL服务器.创建用户.删除用户.密码管理和权限管理等内容. 登录MySQL服务器 mysql ...

  3. Redis(四)主从复制

    主从复制 简介 主机数据更新之后根据配置和策略,自动同步数据到备机的Master/Slaver机制,Master以写为主,Slaver以读为主. 这样的机制能够实现: 读写分离:Master以写为主, ...

  4. 从源码角度分析ScheduleMaster的节点管理流程

    ScheduleMaster是一个开源的分布式任务调度系统,它基于.NET Core 3.1平台构建,支持跨平台多节点部署运行. 项目主页:https://github.com/hey-hoho/Sc ...

  5. docker上面部署nginx-waf 防火墙“modsecurity”,使用CRS规则,搭建WEB应用防火墙

    web防火墙(waf)免费开源的比较少,并且真正可以商用的WAF少之又少,modsecurity 是开源防火墙鼻祖并且有正规公司在维护着,目前是https://www.trustwave.com在维护 ...

  6. Kubernetes(K8S) kubesphere 安装

    安装KubeSphere最好的方法就是参考官方文档,而且官方文档是中文的. 官网地址:https://kubesphere.com.cn/ https://github.com/kubesphere/ ...

  7. TypeScript 引用资源文件后提示找不到的异常处理

    在tsx中引用图片,在文件文本编辑器中提示错误引用: typescript无法识别非代码文件(js是可以的).如果需要在ts中识别此文件资源,可以先声明文件类型. 新建一个ts文件,比如global. ...

  8. Python网络爬虫原理及实践

    作者:京东物流 田禹 1 网络爬虫 网络爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 网络爬虫相关技术和框架繁多,针对场景的不同可以选择不同的网络爬虫技术. 2 Scrapy框架( ...

  9. MD5简述及常见解密网址推荐

    什么是md5 MD5(Message-Digest Algorithm 5)(信息-摘要算法5), 一种被广泛使用的[密码散列函数](https://baike.baidu.com/item/密码散列 ...

  10. 2022-12-05:部门工资前三高的所有员工。编写一个SQL查询找出每个部门中收入前三高的员工 。 +------------+----------+--------+ | Department |

    2022-12-05:部门工资前三高的所有员工.编写一个SQL查询找出每个部门中收入前三高的员工 . ±-----------±---------±-------+ | Department | Em ...