复健,时间有限题解比较简陋


A. Middle of the Contest

将小时转成分钟,得到起止时间在一天中的分钟数,取平均值即可,复杂度O(1)。平均值转换会时间的时候注意前导0。

void solve(int x) {
x /= 2;
printf("%02d:%02d\n", x / 60, x % 60);
}
int main() {
// freopen("in.txt", "r", stdin);
// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)cpp;
int h1, h2, m1, m2;
char c;
cin >> h1 >> c >> m1;
cin >> h2 >> c >> m2;
solve(h1 * 60 + m1 + h2 * 60 + m2);
}

B. Preparation for International Women’s Day

要加起来能被k整除, 只需要看模k的余数即可。余数为i的与余数为k-i的互补可以被k整除,通过计数看有多少对能互补。需要注意的是,为余数为0k/2(k为偶数)时,只能同余数的互补,此时计数是偶数个时都能配对,奇数个时能配对的数量是计数 - 1。复杂度O(n + k)

int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n, k, x, cnt = 0;
cin >> n >> k;
int d[k] = {0};
for (int i = 0; i < n; ++i) cin >> x, d[x % k]++;
for (int i = 0; i < (k + 1) / 2; ++i) {
if (i == 0)
cnt += d[i] / 2;
else {
cnt += min(d[i], d[k - i]);
}
}
if (k % 2 == 0) cnt += d[k / 2] / 2;
cout << cnt * 2;
}

C. Balanced Team

单调队列,从小到大添加元素,保证队首和队尾差不超过5,超过了则出队,否则用当前队列大小更新最优解。如果元素x < yx一定比y先入队,而且能与x共存的最小值sx和能与y共存的最小值sysx <= sy。使用单调队列,每次入队后进行出队操作,出队完成后队首就是能与入队元素共存的最小值,队列内的元素就是以入队元素为最大值时所有能存在的元素。复杂度O(n)

int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n;
cin >> n;
ll a[n + 1];
for (int i = 1; i <= n; ++i) cin >> a[i];
sort(a + 1, a + 1 + n);
int cnt = 0, l = 1, r = 2;
while (l <= r && r <= n) {
if (a[r] - a[l] > 5) cnt = max(cnt, r - l), l++;
r++;
}
cnt = max(cnt, r - l);
cout << cnt;
}

D. Zero Quantity Maximization

d * a[i] + b[i] = 0可得d = - b[i] / a[i],统计每种d取值的个数,取最大即可。对于a[i]0的情况需要特殊讨论,如果b[i]也为0则此时d可以取任意值;否则,d的取值为0。另外,为了避免浮点误差,不能直接统计d,而是要统计<a, b>这个配对;同时,为了归一化,需要将ab同时除以他们的最大公约数,并保证a是正数。复杂度O(nlog(n)),log是因为用了map来计数。

// Author : RioTian
// Time : 20/11/10
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n;
cin >> n;
ll a[n + 1], b[n + 1];
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
int zeroBCnt = 0, zeroBothCnt = 0;
map<pair<int, int>, int> hash;
for (int i = 0; i < n; ++i) {
if (a[i] == 0) {
if (b[i] == 0) ++zeroBothCnt;
continue;
}
if (b[i] == 0) {
++zeroBCnt;
}
int divisor = gcd(abs(a[i]), abs(b[i]));
a[i] /= divisor;
b[i] /= divisor;
if (a[i] < 0) {
a[i] = -a[i];
b[i] = -b[i];
}
if (hash[make_pair(a[i], b[i])])
++hash[make_pair(a[i], b[i])];
else
hash[make_pair(a[i], b[i])] = 1;
}
int ans = zeroBCnt;
for (auto item : hash) {
if (item.second > ans) ans = item.second;
}
cout << ans + zeroBothCnt << endl;
return 0;
}

E. K Balanced Teams

与C题思路类似,先得到取每个元素为最大值,能共存的元素有哪些(排过序的数组保留首位指针即可),比如位置为i的元素最小可共存元素的位置是maxStart[i],这样数组里面maxStart[i]i都是可共存元素。问题就转成如何在里面选k个,让元素尽量多,这样dp即可。dp[i][j]表示前i个元素选j队的最优值,则如果选maxStart[i]i,最优值为dp[maxStart[i] - 1], j - 1] + i - maxStart[i] + 1;如果不选,最优值为dp[i - 1][j];两者取最优得到状态转移方程。另外由于j只会从j - 1转移,因此可以用滚动数组节约内存。复杂度O(nk)

// Author : RioTian
// Time : 20/11/10
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 10;
int a[N], maxStart[N], dp[N][2];
int n, k;
int main() {
cin >> n >> k;
for (int i = 0; i < n; ++i) cin >> a[i];
sort(a, a + n);
int l = 0, r = 0;
while (r < n) {
if (a[r] - a[l] <= 5) {
maxStart[r] = l, ++r;
continue;
}
++l;
}
for (int i = 1; i <= k; ++i) {
for (int j = 0; j < n; ++j) {
if (maxStart[j]) {
dp[j][i % 2] =
max(dp[j - 1][i % 2],
dp[maxStart[j] - 1][(i - 1) % 2] + j - maxStart[j] + 1);
continue;
}
dp[j][i % 2] = max(dp[j - 1][i % 2], j - maxStart[j] + 1);
}
}
cout << dp[n - 1][k % 2] << endl;
return 0;
}

F1. Spanning Tree with Maximum Degree

直接找到度最大的节点bfs即可,复杂度O(n + m)

#include <iostream>
#include <queue>
#include <vector> using namespace std; vector<int> node[200010];
bool visited[200010]; void bfs(int start) {
queue<int> qu;
qu.push(start);
visited[start] = true;
while (qu.size()) {
int cur = qu.front();
qu.pop();
for (auto next : node[cur]) {
if (visited[next]) continue;
visited[next] = true;
qu.push(next);
cout << cur + 1 << ' ' << next + 1 << endl;
}
}
} int main() {
int n, m, x, y, tmp, maxCnt = 0, maxNode = -1;
cin >> n >> m;
for (int i = 0; i < m; ++i) {
cin >> x >> y;
--x;
--y;
node[x].push_back(y);
node[y].push_back(x);
tmp = node[x].size() > node[y].size() ? x : y;
if (node[tmp].size() > maxCnt) {
maxCnt = node[tmp].size();
maxNode = tmp;
}
}
bfs(maxNode);
return 0;
}

F2. Spanning Tree with One Fixed Degree

如果从1的一个分支出发能从另一个分支回到1,则这些分支划分为同一组,dfs即可得到这些分组。如果一组里面所有分支都被去掉了,则这组里面的节点就无法出现在树里面,因此至少要保留一个。dfs得到有多少这样的组,每组里面取一个分支,剩下还可以取则任意取。这些分支作为bfs的第一步,继续搜下去,按搜索顺序输出即可。非法的情况有:dfs时存在节点没有走到;需要的度数比组数少(此时至少有一组所有分支都被去掉);需要的度数比1链接的分支多。复杂度O(n + m)

#include <cstring>
#include <iostream>
#include <queue>
#include <vector> using namespace std;
bool visited[200010];
vector<int> node[200010];
vector<int> group[200010];
queue<int> qu;
int n, m, d, g; void dfs(int cur, int parent) {
visited[cur] = true;
for (auto next : node[cur]) {
if (visited[next]) {
if (parent == -1) group[g - 1].push_back(next);
continue;
}
if (parent == -1) {
group[g++].push_back(next);
}
dfs(next, cur);
}
} void bfs() {
while (qu.size()) {
int cur = qu.front();
qu.pop();
for (auto next : node[cur]) {
if (!visited[next]) {
visited[next] = true;
cout << cur + 1 << ' ' << next + 1 << endl;
qu.push(next);
}
}
}
} int main() {
int x, y;
cin >> n >> m >> d;
for (int i = 0; i < m; ++i) {
cin >> x >> y;
--x;
--y;
node[x].push_back(y);
node[y].push_back(x);
}
memset(visited, 0, sizeof(visited));
dfs(0, -1);
for (int i = 0; i < n; ++i) {
if (!visited[i]) {
cout << "NO" << endl;
return 0;
}
}
if (g > d || node[0].size() < d) {
cout << "NO" << endl;
return 0;
}
cout << "YES" << endl;
memset(visited, 0, sizeof(visited));
visited[0] = true;
d -= g;
for (int i = 0; i < g; ++i) {
cout << '1' << ' ' << group[i][0] + 1 << endl;
visited[group[i][0]] = true;
qu.push(group[i][0]);
for (int j = 1; d && j < group[i].size(); ++j) {
cout << '1' << ' ' << group[i][j] + 1 << endl;
visited[group[i][j]] = true;
qu.push(group[i][j]);
--d;
}
}
bfs();
return 0;
}

Codeforces Round #544 (Div. 3)简单题解的更多相关文章

  1. Codeforces Round #544 (Div. 3) 题解

    Codeforces Round #544 (Div. 3) D. Zero Quantity Maximization 题目链接:https://codeforces.com/contest/113 ...

  2. # Codeforces Round #529(Div.3)个人题解

    Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...

  3. Codeforces Round #557 (Div. 1) 简要题解

    Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...

  4. Codeforces Round #538 (Div. 2) (A-E题解)

    Codeforces Round #538 (Div. 2) 题目链接:https://codeforces.com/contest/1114 A. Got Any Grapes? 题意: 有三个人, ...

  5. Codeforces Round #531 (Div. 3) ABCDEF题解

    Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...

  6. Codeforces Round #499 (Div. 1)部分题解(B,C,D)

    Codeforces Round #499 (Div. 1) 这场本来想和同学一起打\(\rm virtual\ contest\)的,结果有事耽搁了,之后又陆陆续续写了些,就综合起来发一篇题解. B ...

  7. Codeforces Round #540 (Div. 3) 部分题解

    Codeforces Round #540 (Div. 3) 题目链接:https://codeforces.com/contest/1118 题目太多啦,解释题意都花很多时间...还有事情要做,就选 ...

  8. Codeforces Round #527 (Div. 3) ABCDEF题解

    Codeforces Round #527 (Div. 3) 题解 题目总链接:https://codeforces.com/contest/1092 A. Uniform String 题意: 输入 ...

  9. Codeforces Round #821(Div.2) (A-C) 题解

    Codeforces Round #821(Div.2) (A-C) A.Consecutive Sum 大致题意 给定一组共 n 个数据 ,如果俩个数的下标在 mod k 意义下同余,则可以交换a[ ...

  10. Codeforces Round #545 (Div. 1) 简要题解

    这里没有翻译 Codeforces Round #545 (Div. 1) T1 对于每行每列分别离散化,求出大于这个位置的数字的个数即可. # include <bits/stdc++.h&g ...

随机推荐

  1. WPF应用开发之附件管理

    在我们之前的开发框架中,往往都是为了方便,对附件的管理都会进行一些简单的封装,目的是为了方便快速的使用,并达到统一界面的效果,本篇随笔介绍我们基于SqlSugar开发框架的WPF应用端,对于附件展示和 ...

  2. 30分钟带你精通git使用

    非常抱歉,由于篇幅和时间限制,无法在30分钟内提供3000字左右的详细git使用介绍. Git是一个强大的版本控制系统,学习使用它需要一定的时间和实践.以下是一个简要的Git使用指南,帮助您入门并进行 ...

  3. java文件读取 while ((len = reader.read(buffer)) != -1){}的理解

    源文件 InputStreamReader reader=new InputStreamReader(new FileInputStream(file),"UTF-8"); //读 ...

  4. 华企盾DSC防泄密系统造成应用程序卡慢、编译卡问题

    1.先看看个人模式是否正常,正常则跟进程有关加密nofile.不启用进程水印.不启用文件夹大小缓存(源码文件去掉需慎重)都关掉.允许进程间访问(procmon排查是否有其它进程访问) 2.检查是否与H ...

  5. Kernel Memory 入门系列:文档的管理

    Kernel Memory 入门系列: 文档的管理 在Quick Start中我们了解到如何快速直接地上传文档.当时实际中,往往会面临更多的问题,例如文档如何更新,如何划定查询范围等等.这里我们将详细 ...

  6. 前端异步编程 —— Promise对象

    在前端编程中,处理一些简短.快速的操作,在主线程中就可以完成. 但是,在处理一些耗时比较长以至于比较明显的事情,比如读取一个大文件或者发出一个网络请求,就需要异步编程来实现,以避免只用主线程时造成页面 ...

  7. 开源MES/免费MES/开源mes 生产管理流程

    开源MES/免费MES/开源MES生产流程管理 一.什么是MES生产管理流程 生产管理系统(又称制造执行系统)是一种集成了计划.生产.质量控制.库存管理和材料申请等生产流程的管理系统.工厂生产管理流程 ...

  8. 假如这个地方可能为null,那他一定会为null

    假如你的代码,在某个地方(比如controller层)提示你:这个方法调用可能会产生null,那么千万不要视而不见,在某一瞬间它一定会是null,势必报错. /** * 修改保存管理员 */ @Pos ...

  9. AutoGPT实战

    1.概述 人工智能(AI)的能力持续在全球范围内引起轰动,并对我们日常生活和职业生涯带来重大变革.随着像ChatGPT这样的先进生成型AI模型以及从GPT-3到GPT-4的加速,我们在高级推理.理解更 ...

  10. ElasticSearch之cat recovery API

    命令样例如下: curl -X GET "https://localhost:9200/_cat/recovery?v=true&pretty" --cacert $ES_ ...