Codeforces Round 916 (Div. 3) (A~F附带题解和详细思路)
Codeforces Round 916 (Div. 3) (A~E2)
A. Problemsolving Log
签到题,对于给出的字符串,用数组记录每个字母出现的次数,然后遍历一边记录数组,如果对应的字母出现次数大于它的位次,则说明该字母对应的题目被解出来了,最后输出解题数量即可
void solve()
{
int n;
cin >> n;
string s;
cin >> s;
int st[27] = {0};
int count = 0;
for(int i=0;i<s.size();i++)
{
st[s[i]-'A'+1]++;
}
for(int i=1;i<27;i++)
{
if(st[i]>=i) count++;
}
cout << count << endl;
}
B. Preparing for the Contest
简单排序,要有k个升序的数,则前面排1 ~ k即可,后面从n ~ k+1降序排列
void solve()
{
int n,k;
cin >> n >> k;
int i;
for(i=1;i<=k;i++)
{
cout << i << " ";
}
for(int j=n;j>=k+1;j--)
{
cout << j << " ";
}
cout << endl;
}
C. Quests
贪心+暴力题,首先预处理出a的前缀和maxa,并且维护一个maxb[i],表示b[i]前i个数中的最大值,然后从1~n遍历,每一次获得的经验应该是maxa[i] + (k-i)*maxb[i],然后取最大值即可,记得处理一下边界情况
- if(i > k) break;
- (k - i >= 0 ? k - i : 0)
#define int long long
const int N = 2e5 + 10;
int a[N], b[N];
int maxa[N], maxb[N];
void solve()
{
int n, k;
int mmax = 0;
cin >> n >> k;
maxa[0] = maxb[0] = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
maxa[i] = maxa[i - 1] + a[i];
}
for (int i = 1; i <= n; i++)
{
cin >> b[i];
maxb[i] = max(maxb[i - 1], b[i]);
}
for (int i = 1; i <= n; i++)
{
if(i > k) break;
int tmp = maxa[i] + maxb[i] * (k - i >= 0 ? k - i : 0);
mmax = max(mmax, tmp);
}
cout << mmax << endl;
}
D. Three Activities
无脑暴力打表,记得关闭io流同步哦,不然会TLE
PII a[N],b[N],c[N];
void solve()
{
int n;
cin >> n;
for(int i=0;i<n;i++)
{
cin >> a[i].first;
a[i].second = i;
}
for(int i=0;i<n;i++)
{
cin >> b[i].first;
b[i].second = i;
}
for(int i=0;i<n;i++)
{
cin >> c[i].first;
c[i].second = i;
}
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
int max1 = a[n-1].first; //a b c
for(int i=n-1;i>=0;i--)
{
if(b[i].second!=a[n-1].second)
{
max1 += b[i].first;
for(int j = n-1;j>=0;j--)
{
if(c[j].second!=a[n-1].second && c[j].second!= b[i].second)
{
max1 += c[j].first;
break;
}
}
break;
}
}
int max2 = b[n-1].first; // b a c
for(int i=n-1;i>=0;i--)
{
if(a[i].second!=b[n-1].second)
{
max2 += a[i].first;
for(int j = n-1;j>=0;j--)
{
if(c[j].second!=b[n-1].second && c[j].second!= a[i].second)
{
max2 += c[j].first;
break;
}
}
break;
}
}
int max3 = c[n-1].first; //c a b
for(int i=n-1;i>=0;i--)
{
if(a[i].second!=c[n-1].second)
{
max3 += a[i].first;
for(int j = n-1;j>=0;j--)
{
if(b[j].second!=c[n-1].second && b[j].second!= a[i].second)
{
max3 += b[j].first;
break;
}
}
break;
}
}
int max4 = a[n-1].first; //a c b
for(int i=n-1;i>=0;i--)
{
if(c[i].second!=a[n-1].second)
{
max4 += c[i].first;
for(int j = n-1;j>=0;j--)
{
if(b[j].second!=a[n-1].second && b[j].second!= c[i].second)
{
max4 += b[j].first;
break;
}
}
break;
}
}
int max5 = b[n-1].first; //b c a
for(int i=n-1;i>=0;i--)
{
if(c[i].second!=b[n-1].second)
{
max5 += c[i].first;
for(int j = n-1;j>=0;j--)
{
if(a[j].second!=b[n-1].second && a[j].second!= c[i].second)
{
max5 += a[j].first;
break;
}
}
break;
}
}
int max6 = c[n-1].first; //c b a
for(int i=n-1;i>=0;i--)
{
if(b[i].second!=c[n-1].second)
{
max6 += b[i].first;
for(int j = n-1;j>=0;j--)
{
if(a[j].second!=c[n-1].second && a[j].second!= b[i].second)
{
max6 += a[j].first;
break;
}
}
break;
}
}
cout << max({max1,max2,max3,max4,max5,max6}) << endl;
}
E1&&E2 Game with Marbles
只要先按照a+b排序,然后模拟过程即可
int a[N],b[N];
PII c[N];
void solve()
{
int n,sum = 0;
cin >> n;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
for(int i=0;i<n;i++)
{
cin >> b[i];
}
for(int i=0;i<n;i++)
{
c[i].first = a[i] + b[i];
c[i].second = i;
}
sort(c,c+n,[&](PII _1,PII _2){return _1.first > _2.first;});
for(int i=0;i<n;i++)
{
if(i&1)
{
a[c[i].second] = 0;
b[c[i].second] -= 1;
}
else
{
a[c[i].second] -= 1;
b[c[i].second] = 0;
}
}
for(int i=0;i<n;i++)
{
if(a[i]) sum+=a[i];
else sum-=b[i];
}
cout << sum << endl;
}
F. Programming Competition
这是一个树型结构+dfs的题目,其次,codeforces better的翻译有问题,题意的原意应该是,所有的节点都不能和自己同一颗树上的节点匹配,也就是他不能匹配他的所有上级,同时也不能匹配自己的所有下级
其次,我们在这里用邻接表来存树,这样方便我们dfs,然后,实际上,我们通过分治的思想可以发现,对于一个任意子树,他能够提供的匹配其实存在两种情况
以下约定子树大小指的是子树的子节点数量(包括本身)
最大子树小于等于当前子树节点总和的1/2
那么在这种情况下,所有的子树均可以相互匹配(关于匹配方法:只需要任取两个最大的出来匹配,然后重复,最后一定可以全部匹配或者仅剩下一个节点未匹配(也就是子树总和为奇数的情况)),而这种情况下,我们可以直接确定出当前根节点子树能够提供的最大匹配量,无需再向下递归他的子树了,可以做出剪枝最大子树大于当前子树节点总和的1/2
那么在这种情况下,所有的除最大子树外的所有子树均可以跟最大子树匹配,因此能够提供的匹配量就是除了最大子树外的所有子树节点的总和,但是,因为最大子树上任然存在没有匹配的节点,也就是说当前子树的最大匹配量任然没有确定,我们需要向下递归进入最大子树
因此,事实上,我们递归的永远都是大于1/2的子树,因为小于1/2的子树,其最大匹配量已经确定,无需再递归,但是对于我们递归的这些子树,他们的部分节点可能在上一层的时候就匹配出去了,因此我们在递归函数里面应该再引入一个变量c来记录上一层匹配出去的数量,此时,我们本层递归能够匹配的量就是当前子树节点总和-c
,但是!!!实际上,根据贪心的思想,我们发现,我们递归每一层子树的时候,根节点都是不参与匹配的,但是根节点又确实属于子树的一个节点,因此我们可以先将根节点匹配出去,然后剩下的子树匹配出去的节点数就是c-1了
至此,我们整个题目的思路就是以上所述,具体的实现请参照代码
const int N = 2e5 + 10;
int e[N], ne[N], h[N], idx, son[N];
//son(i)记录的是以节点i为根节点的子树的节点个数和
int ans = 0;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int calcson(int u) //预处理计算每一个子树的节点个数
{
son[u] = 1;
for (int i = h[u]; ~i; i = ne[i])
{
son[u] += calcson(e[i]);
}
return son[u];
}
void dfs(int u, int c)
{
if (c > 0) //将c中的一个匹配到当前子树的根节点上
c--;
int maxsontree = e[h[u]]; // 找当前根节点的最大子树
int sonsum = 0; //统计子树和
for (int i = h[u]; ~i; i = ne[i]) //枚举每颗子树
{
sonsum += son[e[i]];
if (son[maxsontree] < son[e[i]])
{
maxsontree = e[i];
}
}
if (son[maxsontree] - c <= sonsum - son[maxsontree]) // 如果最大的子树小于当前总节点数的1/2
{
ans += (sonsum - c) >> 1; //答案就是子树和-c除以二向下取整
}
else //如果最大的子树大于当前总节点数的1/2
{
ans += sonsum - son[maxsontree];
dfs(maxsontree, c + sonsum - son[maxsontree]); //递归最大子树
}
}
void solve()
{
ans = 0;
memset(h, -1, sizeof h);
int n;
cin >> n;
for (int i = 2; i <= n; i++) //建树
{
int t;
cin >> t;
add(t, i);
}
calcson(1); //计算每颗子树的节点数
dfs(1, 0);
cout << ans << endl;
}
Codeforces Round 916 (Div. 3) (A~F附带题解和详细思路)的更多相关文章
- Codeforces Round #609 (Div. 2)前五题题解
Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...
- Codeforces Round #573 (Div. 1) 差F
Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...
- Codeforces Round #541 (Div. 2) (A~F)
目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...
- Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)
F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...
- Codeforces Round #600 (Div. 2)E F
题:https://codeforces.com/contest/1253/problem/E 题意:给定n个信号源,俩个参数x和s,x代表这个信号源的位置,s代表这个信号源的波及长度,即这个信号源可 ...
- Codeforces Round #346 (Div. 2) E F
因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...
- Codeforces Round #322 (Div. 2) E F
E. Kojiro and Furrari 题意说的是 在一条直线上 有n个加油站, 每加一单位体积的汽油 可以走1km 然后每个加油站只有一种类型的汽油,汽油的种类有3种 求从起点出发到达终点要求使 ...
- Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers
CF-1029F 题意: a,b个小正方形构造一个矩形,大小为(a+b),并且要求其中要么a个小正方形是矩形,要么b个小正方形是矩形. 思路: 之前在想要分a,b是否为奇数讨论,后来发现根本不需要.只 ...
- Codeforces Round #648 (Div. 2) A~F题解
开始补cf了,还是记录一下,加深思路,打的应该都是div2.题面不截图了,直接说题意,思路,代码. A 题意:给一个01矩阵,两个人轮流填格子,仅当第i行,第j列全为0时才能填,不能填的人输,问谁赢? ...
- Codeforces Round #410 (Div. 2)A B C D 暴力 暴力 思路 姿势/随机
A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
随机推荐
- 算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 216/10000 抱个拳,送个礼 神经网络设计与选择 参数初始化与优化 学习率 ...
- VirtualBox中Ubuntu 22.04 Server支持kvm
kvm简介 KVM 是 Kernel-based Virtual Machine 的缩写,是一种用于虚拟化的开源硬件虚拟化技术. 使用 Linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机. K ...
- Vue3 之 reactive、ref、toRef、toRefs 使用与区别,源码分析详细注释
目录 reactive.ref.toRef.toRefs 使用与区别 reactive ref 作用及用法 toRef 作用及用法 toRefs 作用及用法 ref,toRef,toRefs 源码实现 ...
- AT_arc041_b 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定一个 \(N \times M\) 的矩阵,此矩阵的每一个元素都向上.下.左.右 ...
- JMeter While循环控制器应用之遍历获取文件参数
While循环控制器应用之遍历获取文件参数 by: 授客 QQ:1033553122 测试环境 JMeter-5.4.1 应用 实现单线程在单次迭代内遍历获取文件参数 说明:上图仅给出关键配置信息 注 ...
- CCF 命令行选项
题目原文 问题描述(题目链接登陆账号有问题,要从这个链接登陆,然后点击"模拟考试",进去找本题目) 试题编号: 201403-3 试题名称: 命令行选项 时间限制: 1.0s ...
- java开发,入职第一天都干什么,带提前了解
2024.7.24,帝都今晚大雨,在雨声磅礴的夜晚适合干什么,没错适合敲代码,写博客,今晚来聊下入职一个新公司,第一天都干什么. 无论是刚毕业的新手小白,还是工作十余年的职场老人,入职一家新公司,只要 ...
- RHCA rh442 001 调优本质 调优方法 监控
调优是一种感知 调优按照成本和性能 一.架构及调优 二.代码及调优 三.配置类调优 从调优效果和成本成正比 设计电商,日访问百万级,未来可能千万级 数据库 系统 服务器多少台 缓存 appache,n ...
- 【Mybatis-Plus】06 代码生成器 CodeGenerator
导入生成器需要的依赖坐标: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybat ...
- 【Vue】09 Webpack Part5 Vue组件化开发
[Vue组件文件打包:Vue-Loader] 复制之前上一个项目 然后在我们的src目录中创建App.vue文件 这个文件就是Vue的模块文件 [建议下载IDEA的Vue.js插件] Vue的模块分为 ...