今天状态还不错,补题补得比较顺利,div2 Solved:5 out of 6
A.
将b,c作为一个整体,个数为b,c的较小值;然后根据e,f的大小,决定先买a,还是先买b,c这个整体。如果先买了,就要贪心的尽可能买光。
#include <bits/stdc++.h>
using namespace std;
int a,b,c,d,e,f,ans1,ans2,sum;
int main(){scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);b=min(b,c);if (e<f){ans2=min(b,d);d-=ans2;sum+=ans2*f;ans1=min(a,d);sum+=ans1*e;}else{ans1=min(a,d);d-=ans1;sum+=ans1*e;ans2=min(b,d);sum+=ans2*f;}printf("%d\n",sum);
return 0;
}
B.
构造一种方案使得整一行的颜色均相同,要求改变次数<=3n。
用一种改变次数<=2n的做法很方便:先假设最终整行都变成了第一个格子的颜色,那么对于【2,n-1】的格子来说,如果当前颜色和第一个格子颜色不同,就改变这个格子和后面的格子颜色,这样操作后可以保证【1,n-1】的格子颜色均相同了。
现在有3种情况:
1.第n个格子颜色恰好相同,结束操作;
2.n-1是一个偶数,那么就把【1,n-1】的格子每隔一个染色,染成和第n个格子一样的颜色;
3.n-1是一个奇数,无法完成染色。
#include <bits/stdc++.h>
using namespace std;
const int N=2e2+5;
int n,tot;
int a[N],ans[N];
char str[N];
int main(){scanf("%d",&n);scanf("%s",str+1);for (register int i=1; i<=n; ++i) if (str[i]=='B') a[i]=1; for (register int i=2; i<n; ++i)if (a[i]!=a[1]){a[i]^=1; a[i+1]^=1;ans[++tot]=i;}if (a[n]!=a[1] && (n-1)%2==1) printf("%d\n",-1);else {if (a[n]!=a[1]){for (register int i=1; i<=n-1; i+=2) ans[++tot]=i;}printf("%d\n",tot);for (register int i=1; i<=tot; ++i) printf("%d ",ans[i]);}
return 0;
}
C.
将平面根据学校的位置分成8个部分:
分别为:在学习左上,左下,右上,右下,正左,正右方,正上,正下。
可以发现,如果帐篷放在(x,y+1),那么左上,右上,正上的学生可以买到帐篷;同理可得放在(x,y-1),(x+1,y),(x-1,y)。
把这四个值取一个最大值即可。
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,xx,yy,ans1,ans2,ans3,ans4,sum1,sum2,sum3,sum4,ans,ansx,ansy;
int x[N],y[N];
int main(){scanf("%d%d%d",&n,&xx,&yy);for (register int i=1; i<=n; ++i) scanf("%d%d",&x[i],&y[i]);for (register int i=1; i<=n; ++i){if (x[i]<xx && y[i]<yy) ans1++;if (x[i]<xx && y[i]>yy) ans2++;if (x[i]>xx && y[i]<yy) ans3++;if (x[i]>xx && y[i]>yy) ans4++;if (x[i]==xx && y[i]<yy) sum1++;if (x[i]==xx && y[i]>yy) sum2++;if (x[i]<xx && y[i]==yy) sum3++;if (x[i]>xx && y[i]==yy) sum4++;}ans=max(ans,ans1+ans2+sum3);ans=max(ans,ans1+ans3+sum1);ans=max(ans,ans3+ans4+sum4);ans=max(ans,ans2+ans4+sum2);if (ans==ans1+ans2+sum3) ansx=xx-1,ansy=yy;if (ans==ans1+ans3+sum1) ansx=xx,ansy=yy-1;if (ans==ans3+ans4+sum4) ansx=xx+1,ansy=yy;if (ans==ans2+ans4+sum2) ansx=xx,ansy=yy+1;printf("%d\n",ans);printf("%d %d\n",ansx,ansy);
return 0;
}
D.
一种方法是贪心地做背包dp,既然要贪心了,为何还要贪心地做dp呢?一贪到底不好吗?
所以我写了可反悔贪心。
此题可以贪心,是基于每个城市只需要一个士兵来驻守,如果需要ith个士兵来驻守,就不能贪心了。
由于无论是早驻守还是晚驻守,收益均相同,所以当然是晚驻守会使得更容易通关,我们统计出每个城市能够被驻守的最晚时间,然后决定:不到最后一刻,坚决不驻守士兵。
弄清楚了这个原则后,就是一道基础的可反悔贪心了,用一个小根堆维护即可。
#include <bits/stdc++.h>
using namespace std;
const int N=5e3+5,M=3e5+5;
int n,m,k,u,v,ans;
int a[N],b[N],c[N],maxn[N];
int cnt,head[N];
struct edge{int next,to;}e[M]; inline void add(int u,int v)
{cnt++;e[cnt].next=head[u];e[cnt].to=v;head[u]=cnt;
}priority_queue< int,vector<int>,greater<int> >q;int main(){scanf("%d%d%d",&n,&m,&k);for (register int i=1; i<=n; ++i) scanf("%d%d%d",&a[i],&b[i],&c[i]); for (register int i=1; i<=n; ++i) maxn[i]=i;for (register int i=1; i<=m; ++i){scanf("%d%d",&u,&v),add(u,v);maxn[v]=max(maxn[v],u); }for (register int i=1; i<=n; ++i){while (k<a[i]) {if (q.size()){int u=q.top(); q.pop();ans-=u;k++;}else{puts("-1");return 0;}}k+=b[i];if (maxn[i]==i){if (k) k--,ans+=c[i],q.push(c[i]);else if (q.size()){if (c[i]>q.top()) {ans-=q.top(),q.pop();ans+=c[i],q.push(c[i]); }}}for (register int j=head[i]; j; j=e[j].next)if (maxn[e[j].to]==i){if (k) k--,ans+=c[e[j].to],q.push(c[e[j].to]);else if (q.size()){if(c[e[j].to]>q.top()){ans-=q.top(),q.pop();ans+=c[e[j].to],q.push(c[e[j].to]); }}}}printf("%d\n",ans);
return 0;
}
E.
这个函数变来变去,好像在数学中总是出现。
一眼看去,答案x具有单调性,所以二分枚举,现在就需要我们迅速统计出当答案为x时再【1,n】的范围内有多少符合条件的数字。
找了一波规律以后才发现,对于奇数和偶数的统计是不同的,原来,奇数有奇数的单调性,偶数有偶数的单调性。
修正刚刚的结论,把奇偶分开做两次二分答案取max即可。
统计符合条件的数字,我用了log(n)的复杂度,如果想更加优化的话,还可以套个二分,这个理论复杂度会变成log(log(n)),但是实际常数应该挺大的。
本人代码复杂度:log(n)*log(n);理论最优复杂度:log(n)*log(log(n))。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,k,l,r,mid,ans1,ans2;
signed main(){scanf("%lld%lld",&n,&k);l=1ll; r=n/2ll;while (l<=r){mid=l+r>>1ll;int now=mid*2ll;int i=0ll;int sum=0ll;while ((now<<i)+(1ll<<(i+1ll))-1ll<=n) sum+=(1ll<<(i+1ll)),i++;if ((now<<i)<=n) sum+=n-(now<<i)+1ll;if (sum>=k) ans1=now,l=mid+1ll;else r=mid-1ll;}l=1ll; if (n%2ll==1ll) r=n/2ll+1; else r=n/2ll;while (l<=r){mid=l+r>>1ll;int now=mid*2ll-1ll;int i=0ll;int sum=0ll;while ((now<<i)+(1ll<<i)-1ll<=n) sum+=(1ll<<i),i++;if ((now<<i)<=n) sum+=n-(now<<i)+1ll;if (sum>=k) ans2=now,l=mid+1ll;else r=mid-1ll;}printf("%lld\n",max(ans1,ans2));
return 0;
}
F.
待小蒟蒻去看看题解…

Codeforces Round #608 (Div. 2)相关推荐

  1. Codeforces Round #608 (Div. 2) E. Common Number

    E. Common Number time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  2. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  3. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  4. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  5. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  6. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  7. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  8. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  9. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

最新文章

  1. 利用CodeIgniter中的Email类发邮件
  2. mysql数据库truncate 夯住_MySQL如何优雅的删除大表实例详解
  3. 学习日记-类继承中的上下转换
  4. mysql周报内容范文_Mysql各种报表查询含实例,日报,周报,月报,时间差自动计算...
  5. 《DSP using MATLAB》示例Example 8.10
  6. SQL基础——DDL、DML、DQL、DCL速览
  7. larvel mysql count,Laravel带条件查询多个count
  8. 两台usrp实现收发_选购光纤收发器时应该注意哪些事项?
  9. Activity保存状态saving activity state和onPause()
  10. VS2017 Community C++模块 离线打包安装
  11. win11怎么关闭触控板?win11关闭触控板的三种解决方法
  12. 2014腾讯实习生招聘数组墙算法
  13. 华林SAP论坛(华林自建的SAP论坛)
  14. xls与csv文件区别
  15. 微信小程序uni-app
  16. 如何录制一个小的 gif
  17. 使用Echars实现水滴状、环形图、分割图、堆叠、组织架构图、地图轮廓等图表
  18. python公开课乐博学院_乐搏学院 - 主页
  19. 对计算的理解计算机科学导论论文,计算机科学导论论文
  20. iOS学习笔记15 序列化、偏好设置和归档

热门文章

  1. 通过批处理 批量拷贝文件夹及子文件下的某扩展名文件。
  2. Android反编译工具及使用
  3. 有热点的地方就有联想,分析联想品牌的特殊营销策略
  4. Git Basics - Recording Changes to the Repository
  5. AWS Certificate Manager ssl证书申请
  6. 做亚马逊为什么一定要注册品牌?原来有这么多好处!
  7. MIPS 、DMIPS、MFLOPS
  8. 阿里云服务器+docker+jenkins+nginx+自定义访问路径
  9. JavaWeb零基础入门之Cookie和Session
  10. 5G网络演进对能源的挑战具体包括哪些