Codeforces Round #608 (Div. 2) 题解

前言

题目链接:仅仅只是为了方便以题目作为关键字能查找到我的题解而已(逃

Codeforces 1271A

Codeforces 1271B

Codeforces 1271C

Codeforces 1271D

Codeforces 1271E

重要:没有F的题解,想看F题题解的神仙们可以走了

A. Suits

题意

给你\(a\)条领带,\(b\)条围巾、\(c\)件背心、\(d\)件夹克,有以下两种套装:

  • 一条领带、一件夹克,花费\(e\)元

  • 一条围巾、一件背心、一件夹克,花费\(f\)元

求出最多可以卖多少钱(不能单卖)。(奸商)

做法

依题意可得:

假如有\(i\)种\(e\)元的套装,那么就是价格是\(i \times e + min \{ d-i, b, c \} \times f\)元,枚举即可(注意 \(i\), \(d-i\), \(b\), \(c\) 中不能出现负数)。

程序

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a,b,c,d,e,f,ans;
  4. int main(){
  5. ios::sync_with_stdio(false);
  6. cin.tie(0);
  7. cout.tie(0);
  8. cin>>a>>b>>c>>d>>e>>f;
  9. for(int i=0;i<=min(a,d);i++){//数据范围小,直接暴力枚举
  10. ans=max(ans,i*e+min((d-i),min(b,c))*f);
  11. }
  12. cout<<ans<<endl;
  13. return 0;
  14. }

B. Blocks

FST的我真的是太菜了

题意

给你一排\(n\)个方块,每个方块有黑白两种颜色,每次操作可以反转两个相邻的方块的颜色,问能否\(3n\)次数内反转成一整排都是同一种颜色。

做法

假设序列反转成白色,那么从前到后跑一遍,如果当前方块不是白色就反转它和它后边的方块,最后一个方块如果跑完操作完是白色就OK。黑色同理,假设序列反转成黑色,那么从前到后跑一遍,如果当前方块不是黑色就反转它和它后边的方块,最后一个方块如果跑完操作完是黑色就OK。最后如果都不可以就输出\(-1\)了。

程序

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. char s[205];
  5. vector<int> op;
  6. int main(){
  7. ios::sync_with_stdio(false);
  8. cin.tie(0);
  9. cout.tie(0);
  10. cin>>n;
  11. cin>>s+1;
  12. //假设全是白色:
  13. for(int i=1;i<n;i++){
  14. if(s[i]=='B'){
  15. s[i]='W';
  16. s[i+1]=s[i+1]=='W'?'B':'W';
  17. op.push_back(i);
  18. }
  19. }
  20. //判断最后一个方块:
  21. if(s[n]=='W'){
  22. cout<<op.size()<<endl;
  23. for(int i=0;i<op.size();i++){
  24. cout<<op[i]<<' ';
  25. }
  26. cout<<endl;
  27. return 0;
  28. }
  29. //假设全是黑色:(此时可以直接再操作同一个序列)
  30. for(int i=1;i<n;i++){
  31. if(s[i]=='W'){
  32. s[i]='B';
  33. s[i+1]=s[i+1]=='W'?'B':'W';
  34. op.push_back(i);
  35. }
  36. }
  37. //判断最后一个方块
  38. if(s[n]=='B'){
  39. cout<<op.size()<<endl;
  40. for(int i=0;i<op.size();i++){
  41. cout<<op[i]<<' ';
  42. }
  43. cout<<endl;
  44. return 0;
  45. }
  46. cout<<-1<<endl;
  47. return 0;
  48. }

C. Shawarma Tent

比B简单

题意

给你一个平面直角坐标系(刚刚数学课学过诶),之后给你一座学校和\(n\)个学生的坐标(都是整点),问你在一个不同于学校的整点上建一个买Shawarma的帐篷,如果学生从学校到家的某一条神奇路径上经过就会买(当消费者傻子吗),问你最多会有几个学生买,和此时帐篷的坐标(任意一种坐标即可)(奸商)。

注:整点指横坐标、纵坐标都是整数的点。神奇路径是只能上下左右移动(平行于横轴或纵轴)的两点间的最短路径(长度就是两点间的曼哈顿距离)(两点间可能有多条)。

做法

显然的,距离学校越近,就会有越多学生从帐篷经过,所以只要枚举学校上下左右的四个点看哪个最优就可以了。

程序

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,sx,sy;
  4. int x[200005],y[200005];
  5. int l,r,u,d;
  6. //l, r, u, d 分别表示左右上下的帐篷经过的学生个数
  7. int main(){
  8. ios::sync_with_stdio(false);
  9. cin.tie(0);
  10. cout.tie(0);
  11. cin>>n>>sx>>sy;
  12. for(int i=1;i<=n;i++){
  13. cin>>x[i]>>y[i];
  14. if(x[i]>sx)r++;
  15. if(x[i]<sx)l++;
  16. if(y[i]>sy)u++;
  17. if(y[i]<sy)d++;
  18. //对于经过帐篷的学生计数
  19. }
  20. if(r>=l&&r>=r&&r>=u&&r>=d){
  21. cout<<r<<endl;
  22. cout<<sx+1<<' '<<sy<<endl;
  23. }else
  24. if(l>=l&&l>=r&&l>=u&&l>=d){
  25. cout<<l<<endl;
  26. cout<<sx-1<<' '<<sy<<endl;
  27. }else
  28. if(u>=l&&u>=r&&u>=u&&u>=d){
  29. cout<<u<<endl;
  30. cout<<sx<<' '<<sy+1<<endl;
  31. }else
  32. if(d>=l&&d>=r&&d>=u&&d>=d){
  33. cout<<d<<endl;
  34. cout<<sx<<' '<<sy-1<<endl;
  35. }
  36. //这里的u>=u之类只是方便copy&paste罢了
  37. return 0;
  38. }

D. Portals

题面好长啊,真的不想翻译

题意

你要攻下\(n\)座城市。一开始你有\(k\)个士兵。攻下第\(i\)个城市,你需要\(a_i\)个士兵(进攻时不损失士兵),攻下后你会抓\(b_i\)个壮丁扩充你的队伍,攻下后你可以派一个士兵来防守,防守会使得你的分数增加\(c_i\),损失一个士兵。防守有两种方式:

  • 你可以防守你所在的第\(i\)个城市

  • 有\(m\)个单向的传送门,从\(u\)到\(v\),如果你在\(u\),可以派兵防守\(v\)(必须是直接被传送门连接的城市)

你必须从第\(1\)座一直攻克到第\(n\)座城市,如果不能攻克全部城市,你就输了,输出\(-1\),如果能赢,求出最大的分数。

做法

贪心的做,计算\(req_i = max \{ a_{i+1} , req_{i+1} - b_{i+1} \} | req_n = 0\)代表在第\(i\)个城市攻克并有\(b_i\)士兵加入后,你完成游戏最少需要的士兵。之后就会有部分士兵空出,第\(i\)个城市空出士兵个数记为\(fr_i\),然后用大根堆来分派士兵到城市就好了。

此时,第\(i\)个城市的可以守卫它的最后一个城市记为\(def_i\),从\(1\)到\(i\)的空闲士兵显然都可以守卫它(空闲士兵可以跟着你到下一个城市)。

程序

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m,k;
  4. int a[5005],b[5005],c[5005],fr[5005];
  5. vector<int> g[5005];//无用数组
  6. int def[5005],req[5005];
  7. priority_queue<pair<int,int> > pq;
  8. int ans;
  9. int main(){
  10. ios::sync_with_stdio(false);
  11. cin.tie(0);
  12. cout.tie(0);
  13. cin>>n>>m>>k;
  14. for(int i=1;i<=n;i++){
  15. cin>>a[i]>>b[i]>>c[i];
  16. def[i]=i;
  17. }
  18. for(int i=1;i<=m;i++){
  19. int u,v;
  20. cin>>u>>v;
  21. g[u].push_back(v);//无用语句
  22. def[v]=max(def[v],u);
  23. }
  24. for(int i=n;i>=1;i--){
  25. req[i]=max(a[i+1],req[i+1]-b[i+1]);cerr<<i<<' '<<req[i]<<endl;
  26. }
  27. //计算req[i]
  28. int cur=k;
  29. for(int i=1;i<=n;i++){
  30. if(cur<a[i]){
  31. cout<<-1<<endl;
  32. return 0;
  33. }
  34. cur+=b[i];
  35. }
  36. //↑判断是否能赢↑
  37. cur=k;
  38. for(int i=1;i<=n;i++){
  39. cur+=b[i];
  40. fr[i]=cur-req[i];cur=req[i];
  41. pq.push(make_pair(c[i],i));
  42. }
  43. //计算fr[i],初始化以重量为第一关键字降序排列的堆
  44. while(!pq.empty()){
  45. int val=pq.top().first,x=pq.top().second;
  46. pq.pop();
  47. int y=def[x];
  48. while(!fr[y]&&y>0)y--;
  49. if(y==0)continue;
  50. fr[y]--;//贪心地选择最后一个能选的城市的空闲士兵
  51. ans+=val;
  52. }
  53. cout<<ans<<endl;
  54. return 0;
  55. }

E. Common Number

题意

做到E的人应该都知道吧。。。而且题面很简短我就不写了(逃

做法

定义\(k_i\)为包含\(i\)的路径的个数。

首先,奇数和偶数分开考虑,你会发现同一个\(n\),同为奇数或偶数时,\(y\)变大了\(k_y\)肯定变小,所以具有单调性,可以二分。

我们再来看对于单个的数,如何计算包含它的路径条数:

把路径的计算反过来想,可以得出在路径的反推中,只有偶数可以加一,而所有数都可以乘二。记录有多少个可以通过这种方式得到的数就可以了。但是这样太慢了,所以我们需要一个更快的方法:

通过观察得出,乘二的次数相同时,从最小可达值(只乘过二)到最大可达值(每次乘二后都加一),之间的所有数都是可以达到的,那么我们只要计算最小值和最大值就好了,复杂度--。由于乘二肯定比加一增长得快,所以对于每一种乘以二的次数,把这个区间的长度加到路径条数就可以了。

程序

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll n,k;
  5. bool check(ll m){
  6. ll l=m,r=m,res=0;
  7. if(!(m&1)){r++;}//当m是偶数时给r增加1
  8. for(int i=1;;i++){//其实i没有什么用
  9. res+=min(n,r)-l+1;//添加区间长度到返回值
  10. //for(int j=l;j<=min(r,n);j++)cerr<<j<<' ';
  11. l<<=1;
  12. r=(r<<1)+1;//计算下一个l和r
  13. if(l>n)break;//当l大于n时就没有计算的必要了,直接退出
  14. }//cerr<<endl;
  15. return res>=k;
  16. }
  17. int main(){
  18. ios::sync_with_stdio(false);
  19. cin.tie(0);
  20. cout.tie(0);
  21. cin>>n>>k;
  22. //for(int i=1;i<=n;i++)check(i);
  23. ll l=1,r=(n+1)/2,m,ans;//二分奇数
  24. while(l<=r){
  25. m=(l+r)>>1;
  26. if(check(2*m-1)){
  27. ans=2*m-1;
  28. l=m+1;
  29. }else{
  30. r=m-1;
  31. }
  32. }
  33. l=1;r=n/2;//二分偶数
  34. while(l<=r){
  35. m=(l+r)>>1;
  36. if(check(2*m)){
  37. ans=max(ans,2*m);//由于ans已经取了奇数的值,所以这里是max
  38. l=m+1;
  39. }else{
  40. r=m-1;
  41. }
  42. }
  43. cout<<ans<<endl;
  44. return 0;
  45. }

结束语

点个在看吧!

很抱歉不会F题不能帮到部分人,所以我(逃

Codeforces Round #608 (Div. 2) 题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  3. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  4. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  5. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  6. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  7. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

  8. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

  9. Codeforces Round #271 (Div. 2)题解【ABCDEF】

    Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...

随机推荐

  1. eclipse导出jar(java打包导出jar)

    有时候需要将j2se工程导出,这样可以在别处运作,就不必拘泥于开发感觉中才能运行了.具体做法如下:方法一:(工程没有引用外部jar包时,直接导出) 选中工程---->右键,Export...-- ...

  2. @PathVariable 处理参数为空的情况

    @RequestMapping(value = "/get/{id}/{userId}", method = RequestMethod.GET) public Result ge ...

  3. ELK的简单搭建

    Environment  (都需要Java环境,jdk){ elasticsearch kibana 安装nginx用以测试 logstash } 1.首先拉取软件包,给予Java语言开发首选配置Ja ...

  4. 复选框、单选框样式自定义(https://www.cnblogs.com/freedom-feng/p/11346396.html)

    复选框.单选框样式自定义(https://www.cnblogs.com/freedom-feng/p/11346396.html)复选框html内容如下:<input type="c ...

  5. Python面试的一些心得,与Python练习题分享【华为云技术分享】

    版权声明:本文为CSDN博主「华为云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/devcloud/arti ...

  6. eclipse m2eclipse 从Maven的本地库中读取依赖库

    在Mac pro的终端中执行命令 mvn package 后,已经把该工程所需要的依赖库(dependancies)下载到本地库,但在把该工程 import 到 eclipse中时,发现m2eclip ...

  7. Internet History,Technology,and Security - Dawn of Electronic Computing(Week 1)

    一 War Time Computing and Communication 讲到电子计算机,你不得不提起第二次世界大战,虽说二战是人类历史上史无前例的大灾难,不过从某种程度来说,它确实促进了社会的发 ...

  8. luogu P1379 八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...

  9. luogu P1754 球迷购票问题

    题目背景 盛况空前的足球赛即将举行.球赛门票售票处排起了球迷购票长龙. 按售票处规定,每位购票者限购一张门票,且每张票售价为50元.在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值1 ...

  10. Aria2GUI for macOS - 百度网盘高速下载

    目录 一. aria2gui 1.1 下载地址:aria2gui 1.2 安装 1.2.1 方式一:手动安装 1.2.2 方式二:Homebrew安装 二. YAAW for Chrome 2.1 下 ...