Codeforces Round #608 (Div. 2)
今天状态还不错,补题补得比较顺利,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)相关推荐
- 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 ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- 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 ...
- 构造 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 的例子可以 ...
- Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...
- Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...
- Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...
- Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...
- Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...
最新文章
- 利用CodeIgniter中的Email类发邮件
- mysql数据库truncate 夯住_MySQL如何优雅的删除大表实例详解
- 学习日记-类继承中的上下转换
- mysql周报内容范文_Mysql各种报表查询含实例,日报,周报,月报,时间差自动计算...
- 《DSP using MATLAB》示例Example 8.10
- SQL基础——DDL、DML、DQL、DCL速览
- larvel mysql count,Laravel带条件查询多个count
- 两台usrp实现收发_选购光纤收发器时应该注意哪些事项?
- Activity保存状态saving activity state和onPause()
- VS2017 Community C++模块 离线打包安装
- win11怎么关闭触控板?win11关闭触控板的三种解决方法
- 2014腾讯实习生招聘数组墙算法
- 华林SAP论坛(华林自建的SAP论坛)
- xls与csv文件区别
- 微信小程序uni-app
- 如何录制一个小的 gif
- 使用Echars实现水滴状、环形图、分割图、堆叠、组织架构图、地图轮廓等图表
- python公开课乐博学院_乐搏学院 - 主页
- 对计算的理解计算机科学导论论文,计算机科学导论论文
- iOS学习笔记15 序列化、偏好设置和归档