Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) A-D
A
题意
设计一条线路要贴着6个墙面走,从 \((a,b)\) 到 \((f,g)\) ,线路长度最短。
题解
知识点:模拟。
分类取最短即可。
时间复杂度 \(O(1)\)
空间复杂度 \(O(1)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
int w, d, h;
int a, b, f, g;
cin >> w >> d >> h;
cin >> a >> b >> f >> g;
int ans = h + min(abs(a - f) + min(b + g, 2 * d - b - g), abs(b - g) + min(a + f, 2 * w - a - f));
cout << ans << '\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;
}
B
题意
有 \(n\) 个人要去电影院,第 \(i\) 个人要求至少 \(a_i\) 个其他人去他才去,问最终能有多少种选人去电影院的方案,保证每种方案选完后所有符合要求的都去了。
题解
知识点:贪心。
从小到大排序。如果低要求的人能去就先去,保证要求高的人去之前能去的都去。如果低要求的都去不了,换成高要求的更去不了,不如先预选低要求的,看看后面能不能补上。如此,可以得到所有方案。
因为可以都不去,所以如果第一个人就有 \(\geq 1\) 的要求时,显然是可以都不去的。
对于 \(i\in[1,n)\) ,如果 \(a_i \leq i-1\) 且 \(a_{i+1} > i\) ,说明 \([1,i]\) 都能去,但不能直接选 \(i+1\) ,因为缺人需要继续安排后面的看看能不能补上,所以这里可以方案加一。
其他情况,\([1,i+1]\) 都能去则必须安排在一个方案;\([1,i+1]\) 都不能去,继续选,不能算做一个方案;\([1,i]\) 不能去,但 \([1,i+1]\) 可以去,此时要继续往后选,让这个方案能去的人都去。
最后,上述判断包括不了全都去,因此特判方案加一。
时间复杂度 \(O(n \log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[200007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
sort(a + 1, a + n + 1);
int ans = 0;
if (a[1] != 0) ans++;
for (int i = 1;i < n;i++) {
if (a[i] <= i - 1 && a[i + 1] > i) ans++;
}
ans++;
cout << ans << '\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
题意
给出一个小写字母的字符串,每次修改可以使一个位置的字母替换成任意字母,求出修改的最少次数,使字符串的字母出现次数相同,并输出修改后的字符串。
题解
知识点:模拟,枚举,贪心。
注意到,直接枚举最后的个数很困难,但枚举最后有几种字母很容易,因此考虑枚举最后剩多少种字母。
接下来分两步走:
- 确定最少要变多少位置,同时确定最少答案情况的字母种数。
- 通过上一步确定的信息,遍历字符串更改。
第一步:
先将每个字母对应的出现次数记录好,同时保存字母本身的序号,方便排序后还能找到对应的字母。
枚举字母种数 \(i\) ,满足 \(i \mid n\) ,则最终每种字母会有 \(x = \dfrac{n}{i}\) 个。我们可以贪心地选择保留数量最多的前 \(i\) 个,这些字母中数量大于 \(x\) 是必须修改的,而后 \(26-i\) 个字母,全部都需要修改。于是,就可以求出 \(i\) 对应的修改次数 \(delta\) ,枚举取最小值,并记录最终种数 $div $ 和每种数量 \(cnt\),即可。
第二步:
我们此时需要遍历字符串修改,因此需要通过字母序号得到字母的排名(从 \(0\) 开始)和数量,所以需要遍历第一步得到的排名对应数量和序号的数组获得。
若某个位置的字母的数量大于 \(cnt\) 或者排名大于等于 \(div\) 并且字母的数量大于 \(0\) 则需要修改,枚举 \(26\) 个字母找到排名小于 \(div\) 且数量小于 \(cnt\) 的填充进去即可。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
int n;
cin >> n;
string s;
cin >> s;
vector<pair<int, int>> rk(26);
for (int i = 0;i < 26;i++) rk[i] = { 0,i };
for (int i = 0;i < n;i++) rk[s[i] - 'a'].first++;
sort(rk.begin(), rk.end(), greater<pair<int, int>>());
int div = 1;
int ans = 1e9;
for (int i = 1;i <= 26;i++) {
if (n % i) continue;
int x = n / i;
int delta = 0;
for (int j = 0;j < i;j++) delta += max(0, rk[j].first - x);
for (int j = i;j < 26;j++) delta += rk[j].first;
if (delta < ans) {
ans = delta;
div = i;
}
}
int cnt = n / div;
vector<pair<int, int>> pos(26);
for (int i = 0;i < 26;i++) pos[rk[i].second] = { rk[i].first,i };
for (int i = 0;i < n;i++) {
if (pos[s[i] - 'a'].first > cnt || pos[s[i] - 'a'].second >= div && pos[s[i] - 'a'].first) {
pos[s[i] - 'a'].first--;
for (int j = 0;j < 26;j++) {
if (pos[j].first < cnt && pos[j].second < div) {
s[i] = j + 'a';
pos[j].first++;
break;
}
}
}
}
cout << ans << '\n';
cout << s << '\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;
}
D
题意
给出一个数组 \(a_i \in [1,10^9]\) ,求出 \(x \in [0, 10^{18}]\) 时 \(a_1+x,\cdots,a_n+x\) 中完全平方数的数量的最大值。
题解
知识点:枚举,因数集合。
显然,必然存在 \(x\) 使得 \(a+x\) 是个完全平方数,答案至少为 \(1\) 。考虑答案为 \(2\) 及以上的情况。
我们可以先枚举所有两个数的组合 \(a_i,a_j(i<j)\) ,如果存在大于等于 \(2\) 的答案,必然会包括这些两个数的组合,因而我们可以通过两个数枚举出所有成立的 \(x\) ,对每个 \(x\) 在完整的数组中再跑一遍记录答案即可。
我们考虑如何得到使 \(a_i+x,a_j+x\) 都成为完全平方数的 \(x\) 。设 \(a_i+x = s^2,a_j+x = t^2\) ,直接枚举 \(x\) 复杂度是 \(10^9\) ,考虑枚举 \(s,t\) 相关的数。我们可以得到 \(a_j-a_i = t^2-s^2 = (t+s)(t-s) \in [1,10^9)\) , 因此我们可以枚举 \(t+s,t-s\) ,即枚举 \(a_j-a_i\) 的因子即可,我们最多只需要枚举 \(\sqrt {10^9}\) 次即可,然后再求出 \(t,s\) ,就可以得到 \(x\) 了。
时间复杂度 \(O(n^2\sqrt{10^9})\)
空间复杂度 \(O(n)\)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool issqr(ll n) {
ll x = sqrt(n);
return x * x == n;
}
int a[57];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
int ans = 1;
for (int i = 1;i <= n;i++) {
for (int j = i + 1;j <= n;j++) {
int d = a[j] - a[i];
ll x = -1;
for (int k = 1;k * k <= d;k++) {
if (d % k || ((d / k + k) & 1)) continue;
int s = (d / k + k) / 2;
int t = (d / k - k) / 2;
if (1LL * s * s < a[j] || 1LL * t * t < a[i]) continue;
x = 1LL * s * s - a[j];
int cnt = 0;
for (int k = 1;k <= n;k++) if (issqr(a[k] + x)) cnt++;
ans = max(ans, cnt);
}
}
}
cout << ans << '\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;
}
Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) A-D的更多相关文章
- Codeforces Round #623 (Div. 1, based on VK Cup 2019-2020 - Elimination Round, Engine)A(模拟,并查集)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; pair<]; bool cmp( ...
- Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine)
A. Dead Pixel(思路) 思路 题意:给我们一个m*n的表格,又给了我们表格中的一个点a,其坐标为(x, y),问在这个表格中选择一个不包括改点a的最大面积的矩形,输出这个最大面积 分析:很 ...
- Codeforces Round 623(Div. 2,based on VK Cup 2019-2020 - Elimination Round,Engine)D. Recommendations
VK news recommendation system daily selects interesting publications of one of n disjoint categories ...
- Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine) C. Restoring
C. Restoring Permutation time limit per test1 second memory limit per test256 megabytes inputstandar ...
- Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine) B. Homecoming
After a long party Petya decided to return home, but he turned out to be at the opposite end of the ...
- Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine) A Dead Pixel
讨论坏点的左右上下的矩形大小. #include <bits/stdc++.h> using namespace std; int main() { int t; cin >> ...
- Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals)
Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) A.String Reconstruction B. High Load C ...
- Codeforces 1023 A.Single Wildcard Pattern Matching-匹配字符 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter ...
- Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) 菜鸡只会ABC!
Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) 全场题解 菜鸡只会A+B+C,呈上题解: A. Bear and ...
- DP VK Cup 2012 Qualification Round D. Palindrome pairs
题目地址:http://blog.csdn.net/shiyuankongbu/article/details/10004443 /* 题意:在i前面找回文子串,在i后面找回文子串相互配对,问有几对 ...
随机推荐
- 齐博x1动态改变标签调用不同频道的数据
标签默认需要设置标签参数 type 指定调用哪个频道的数据,比如下面的代码,需要默认指定商城的数据, {qb:tag name="qun_pcshow_shop001" type= ...
- python关于Django搭建简单博客项目(教程)
由于csdn各种django blog博文都有或多或少的bug,所以我决定自己写一篇,先附上教程,详解在另一篇博文里,为了便于大家复制粘贴,本文代码尽量不使用图片. 源代码及解析文章请在我的githu ...
- 怎么样子盒子能撑起父盒子?浮动,BFC,边距重叠
怎么样子盒子能撑起父盒子? 从行内元素跟块元素来看: 一般情况下,行内元素只能包含数据和其他行内元素. 而块级元素可以包含行内元素和其他块级元素. 块级元素内部可以嵌套块级元素或行内元素. 建议行内元 ...
- 谣言检测()《Rumor Detection with Self-supervised Learning on Texts and Social Graph》
论文信息 论文标题:Rumor Detection with Self-supervised Learning on Texts and Social Graph论文作者:Yuan Gao, Xian ...
- ES的java端API操作
首先简单介绍下写这篇博文的背景,最近负责的一个聚合型的新项目要大量使用ES的检索功能,之前对es的了解还只是纯理论最多加个基于postman的索引创建操作,所以这次我得了解在java端如何编码实现:网 ...
- Java计算文件或文件夹大小
导入此类后,直接调用FilesUtil.returnSizi(String path),即可获取文件或者文件夹大小. 代码: 1 /** 2 * 路人甲操作文件的工具类 3 * returnSizi( ...
- Seata Server 1.5.2 源码学习
Seata 包括 Server端和Client端.Seata中有三种角色:TC.TM.RM,其中,Server端就是TC,TM和RM属Client端.Client端的源码学习上一篇已讲过,详见 < ...
- 洛谷P5309 Ynoi 2011 初始化 题解
题面. 我也想过根号分治,但是题目刷得少,数组不敢开,所以还是看题解做的. 这道题目要用到根号分治的思想,可以看看这道题目和我的题解. 题目要求处理一个数组a,支持如下操作. 对一个整数x,对数组长度 ...
- SQL Server 读写分离配置的一些问题
1,新建发布服务器遇到此服务器上未安装复制组件 先执行以下sql use mastergoselect @@servername;select serverproperty('servername') ...
- JSP利用AJAX实现页面即时校验验证码
在JSP页面实现验证码校验文章中当时是使用的Servlet类来进行的验证码校验,但是这种方式并不能即时校验,在正常情况下都是直接在用户输入之后就进行校验,这样对用户来说很方便的. AJAX 即&quo ...