【codeforces】【比赛题解】#864 CF Round #436 (Div.2)
做出了4题,还不错,可惜还是掉rating……能保持在蓝名已经不错了。
题目跳转链接。
【A】公平的游戏
题意:
Petya和Vasya在玩游戏。他们有n张卡片(n是偶数)。每张卡片上有一个整数。
游戏开始前,Petya会选出一个数,然后Vasya会选出另一个数(不同于Petya选的数),然后每人从卡片中抽出所有写着他选中的数的卡片。
举个例子,Petya选了5,而Vasya选了10,那么Petya抽出所有写着5的卡片,而Vasya抽出所有写了10的卡片。
如果Petya和Vasya能抽走所有卡片,并且Petya和Vasya获得的卡片数量相同,那么这个游戏是公平的。
判断这个游戏是否公平!
输入:
第一行,一个数\(n\,(2\leqslant n\leqslant100)\)。
接下来n行包含了一个整数序列\(a_{1},a_{2},\cdots,a_{n}\)(每行一个数,\(1\leqslant a_{i}\leqslant 100\))。
输出:
如果游戏是公平的,输出"YES",并在下一行输出两个数,表示Petya和Vasya选的两个数,能让这个游戏公平。
如果游戏不是公平的,输出"NO"。
样例:样例见原题。
题解:
水题。看懂了题意就会做了。要求在序列中只有两种不同的数,并且这两种数的数量相同。
#include<cstdio>
int num[],n;
int main(){
scanf("%d",&n);
int x;
for(int i=;i<=n;++i) scanf("%d",&x), num[x]++;
int ns=,a1=,a2=;
for(int i=;i<=;++i){
if(num[i]){
++ns;
if(!a1) a1=i;
else a2=i;
}
if(ns>){puts("NO");return ;}
}
if(ns==){
if(num[a1]==num[a2]) printf("YES\n%d %d",a1,a2);
else puts("NO");
}
else puts("NO");
return ;
}
【B】Polycrap和字母
题意:
Polycrap喜爱小写字母,而讨厌大写字母。他拿到了一个字符串\(s\),只包含小写和大写字母。
他想从这个字符串中选出一个最大的位置的集合\(A\),使这个集合满足:
①在\(s\)中\(A\)中的元素位的字符互不相同且都为小写字母。
②这些位置之间在s中没有一个是大写字母,即对于任意\(a_{1}<j<a_{2}\),\(s[j]\)都不为大写字母(\(a_{1},a_{2}\in A\))。
告诉Polycrap这个集合的大小。
输入:
第一行,一个整数\(n,\,(1\leqslant n\leqslant 200)\),表示s的长度。
第二行,字符串s,长度为n,只包含大写和小写字母。
输出:
一个数,表示集合的大小。
样例:样例见原题。
题解:
仔细分析题意,可以得出:要求的是任意两个相邻的大写字母之间的不同的小写字母的最大个数。
#include<cstdio>
int n,ans=;
char str[];
int vis[];
int main(){
scanf("%d",&n);
scanf("%s",str); str[n]='A'; str[n+]='\0';
for(int i=;i<=n;++i){
if('a'<=str[i]&&str[i]<='z'){
vis[str[i]]=;
}
else{
int sum=;
for(int j='a';j<='z';++j)
if(vis[j]) ++sum;
if(ans<sum) ans=sum;
for(int j='a';j<='z';++j)
vis[j]=;
}
}
printf("%d",ans);
return ;
}
【C】公共汽车
题意:
一辆公共汽车在\(x\)轴上运动,从\(x=0\)运动到\(x=a\)。当它运动到\(x=a\)时,就立刻掉头前往\(x=0\),当它到达\(x=0\)时,又立刻掉头前往\(x=a\),如此往复。
从\(x=0\)运动到\(x=a\)或者从\(x=a\)运动到\(x=0\)的过程叫做一次旅程。公共汽车总共要行驶\(k\)次旅程。
它的油箱可以装\(b\)升汽油,每运动一个单位要消耗一升的汽油,公共汽车开始时是满油的。
在\(x=f\)处有一个加油站\((0\leqslant f\leqslant a)\),没有其他的加油站了。当从任一方向经过加油站时,公共汽车都可以停下来并加油,装满它的油箱。
公共汽车为了行驶\(k\)次旅程,最少需要加多少次油呢?它最开始从\(x=0\)处开始运动。
输入:
四个数,\(a,b,f,k\)。
输出:
一个数,表示最少加多少次油。
样例:样例见原题。
题解:
很简单的贪心,没油了就加油,只有一点点细节。
#include<cstdio>
int a,b,f,k,ans;
int main(){
scanf("%d%d%d%d",&a,&b,&f,&k);
int now=b,dir=;
if(now<f||now<a-f){puts("-1");return ;}
now-=f;
for(int i=;i<k;++i){
if(dir==){
if(now<a+a-f-f) ++ans,now=b;
now-=a+a-f-f;
if(now<){puts("-1");return ;}
}
if(dir==){
if(now<f+f) ++ans,now=b;
now-=f+f;
if(now<){puts("-1");return ;}
}
dir^=;
}
if(dir==){
if(now<a-f) ++ans;
}
if(dir==){
if(now<f) ++ans;
}
printf("%d",ans);
return ;
}
【D】构造全排列
题意:
Ivan有一个大小为\(n\)的数组,其中每个元素都是\(1\)到\(n\)之间的整数。
最近Ivan学习了关于全排列以及它们的字典序的有关知识。现在他想要替换最少的元素,使得他的数组变成一个全排列。
在替换元素最少的情况下,Ivan想要最终获得的全排列的字典序尽量小。
注意,替换的元素最少是第一关键的。
输入:
第一行,一个数\(n\;(2\leqslant n\leqslant200\,000)\)。
第二行,\(n\)个数,\(a_{1},\,a_{2},\,\cdots,\,a_{n}\,(1\leqslant a_{i}\leqslant n)\),表示Ivan的数组。
输出:
第一行,一个数\(q\),表示最少要替换的次数。
第二行,输出在\(q\)次内能得到的字典序最小的全排列。
样例:样例见原题。
题解:
可以证明,\(q\)等于数组中所有数出现次数-1的和。
我们也可以算出某一个数出现的次数,以判断它是否需要替换。
由此可以想到按照顺序的贪心。
具体看代码吧。
#include<cstdio>
int n,a[],num[],k[],tbd[],tot=;
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%d",a+i), ++num[a[i]];
for(int i=;i<=n;++i)
if(!num[i]) tbd[++tot]=i;
printf("%d\n",tot);
int t=, left=tot;
for(int i=;i<=n;++i){
if(num[a[i]]>){
// printf("%d %d %d\n",a[i],tbd[t],k[a[i]]);
if(a[i]>tbd[t]) num[a[i]]--, a[i]=tbd[t++], --left;
else if(left==tot-t+&&k[a[i]]) num[a[i]]--, a[i]=tbd[t++], --left;
else k[a[i]]=;
}
printf("%d ",a[i]);
}
return ;
}
【E】火灾
题意:
不会的啊……XD
【codeforces】【比赛题解】#864 CF Round #436 (Div.2)的更多相关文章
- Codeforces Round #436 (Div. 2)【A、B、C、D、E】
Codeforces Round #436 (Div. 2) 敲出一身冷汗...感觉自己宛如智障:( codeforces 864 A. Fair Game[水] 题意:已知n为偶数,有n张卡片,每张 ...
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- CF Round #551 (Div. 2) D
CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...
- CF Round #510 (Div. 2)
前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...
- CF Round #600 (Div 2) 解题报告(A~E)
CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...
- Codeforces Round #436 (Div. 2)
http://codeforces.com/contest/864 第一次打cf的月赛-- A 题意:给你一个数列,问你能不能保证里面只有两种数且个数相等.2<=n<=100,1<= ...
- Codeforces Round #436 (Div. 2) C. Bus
http://codeforces.com/contest/864/problem/C 题意: 坐标轴上有x = 0和 x = a两点,汽车从0到a之后掉头返回,从a到0之后又掉头驶向a...从0到a ...
- Codeforces Round #436 (Div. 2) E. Fire
http://codeforces.com/contest/864/problem/E 题意: 有一堆物品,每个物品有3个属性,需要的时间,失效的时间(一开始)和价值.只能一件一件的选择物品(即在选择 ...
- Codeforces Round #436 (Div. 2) D. Make a Permutation!
http://codeforces.com/contest/864/problem/D 题意: 给出n和n个数(ai <= n),要求改变其中某些数,使得这n个数为1到n的一个排列,首先保证修改 ...
随机推荐
- 【移动端debug-4】iOS下setTimeout无法触发focus事件的解决方案
开篇总结:其实目前无法解决这个bug. 这两天做项目遇到了这个case,项目需求是打开页面的时候,input元素自动弹起键盘.由于各种方面的考虑,我们希望通过setTimeout延时200毫秒让inp ...
- 浅谈C++/JAVA/C#运行机制和执行效率
估计有很多同学都对C++/JAVA/C#这三大热门语言的运行机制和执行效率有或多或少的困惑,自己也有,但是经过前期的学习,了解了三者在这两方面的区别,就废话不说了,进入主题吧. 一.运 ...
- SQLServer 重建索引前后对比 (转)
https://www.cnblogs.com/mingl12/p/5730178.html
- idea建立web项目servlet映射的地址/jsp访问不到
用IntelliJ IDEA 2017新建了一个web项目,成功运行后servlet mapping的地址一直访问不到 原因:在配置tomcat的时候Server中Open browser选项勾选之后 ...
- Prime k-tuple UVA - 1404
就是大区间求素数 参考 LightOJ - 1197 https://www.cnblogs.com/WTSRUVF/p/9190660.html 直接套那个代码就好了 #include <i ...
- 【刷题】BZOJ 2157 旅游
Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...
- 【刷题】洛谷 P3834 【模板】可持久化线段树 1(主席树)
题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...
- BZOJ3192:[JLOI2013]删除物品——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3192 箱子再分配问题需要解决如下问题: (1)一共有N个物品,堆成M堆. (2)所有物品都是一样的 ...
- BZOJ2213 [Poi2011]Difference 【乱搞】
题目链接 BZOJ2213 题解 考虑任意一对点的贡献,单独拿出那些点所在位置 一个设为\(1\),一个设为\(-1\),从头到尾扫一遍维护前缀和,以及当前最小前缀和 两者相减更新答案 需要注意的是当 ...
- 网络对抗课题4.3.1 SQL注入原理与实践
网络对抗课题4.3.1 SQL注入原理与实践 原理 SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞.也就是,在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符 ...