人生的大起大落莫过如此,下一场我一定要回紫。


【A】Points on the line

题意:

一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\)。

题解:

暴力两重for,更新答案。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  5. int n,q,ans=0;
  6. int a[100001];
  7. int main(){
  8. scanf("%d%d",&n,&q);
  9. F(i,1,n) scanf("%d",a+i);
  10. sort(a+1,a+n+1);
  11. F(i,1,n){
  12. int xx=a[i], kk=-1;
  13. F(j,i,n){
  14. if(a[j]-xx>q) break;
  15. kk=j;
  16. }
  17. ans=max(ans,kk-i+1);
  18. }
  19. printf("%d",n-ans);
  20. return 0;
  21. }

【B】Our Tanya is Crying Out Loud

题意:

一个数\(n\),每次你可以花费\(A\)的代价把它除以\(k\)(如果\(k|n\)),或者花费\(B\)的代价把它减一。问把这个数变成1的最少代价。

题解:

暴力上,不能除减到能除为止,能除看是除了花费少还是不除花费少。

注意特判\(k=1\)。

  1. #include<cstdio>
  2. #define ll long long
  3. int n,k,A,B;
  4. ll ans;
  5. int main(){
  6. scanf("%d%d%d%d",&n,&k,&A,&B);
  7. if(k==1) {printf("%lld",(ll)(n-1)*A);return 0;}
  8. while(n!=1){
  9. int x=n/k*k;
  10. if(x==0) {ans+=(ll)(n-1)*A; break;}
  11. if(n!=x) ans+=(ll)(n-x)*A, n=x;
  12. else{
  13. x=n/k;
  14. if((ll)(n-x)*A<=B) ans+=(ll)(n-x)*A;
  15. else ans+=B;
  16. n=x;
  17. }
  18. }
  19. printf("%lld",ans);
  20. return 0;
  21. }

【C】Phone Numbers

题意:

限定字符集,求长度为\(k\)的,字典序比给定长度为\(n\)的字符串大的最小的字符串。

题解:

①\(k>n\)时,在原串后补上最小的字符。

②\(k<=n\)时,答案为原串的前\(k\)位+1,即比原串\(k\)位前缀大的第一个字符串。

  1. #include<cstdio>
  2. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  3. #define F2(i,a,b) for(int i=(a);i<(b);++i)
  4. int n,k,tot;
  5. int px[150];
  6. bool used[150];
  7. char str[100010],use[30];
  8. char ans[100010];
  9. int main(){
  10. scanf("%d%d",&n,&k);
  11. scanf("%s",str);
  12. F2(i,0,n) used[str[i]]=1;
  13. F(i,1,140) if(used[i]) use[++tot]=i;
  14. F(i,1,tot) px[use[i]]=i;
  15. if(k>n){
  16. printf("%s",str);
  17. F(i,n+1,k) printf("%c",use[1]);
  18. return 0;
  19. }
  20. F2(i,0,k) ans[i]=str[i]; ans[k]='\0';
  21. int x=k-1;
  22. while(px[ans[x]]==tot){
  23. ans[x]=use[1];
  24. --x;
  25. }
  26. ans[x]=use[px[ans[x]]+1];
  27. printf("%s",ans);
  28. return 0;
  29. }

【D】Alena And The Heater

题意:

已知长度为\(n\)的数组\(a\)和等长的01串\(b\),和通过\(a\)生成\(b\)的方法:

\(b_1=b_2=b_3=b_4=0\)

对于\(5\le i\le n\)

如果\(a_i,a_{i-1},a_{i-2},a_{i-3},a_{i-4}>r\) 并且\(b_{i-1}=b_{i-2}=b_{i-3}=b_{i-4}=1\),那么\(b_i=0\)

如果\(a_i,a_{i-1},a_{i-2},a_{i-3},a_{i-4}<l\) 并且\(b_{i-1}=b_{i-2}=b_{i-3}=b_{i-4}=0\),那么\(b_i=1\)

如果以上两者均不满足,那么\(b_i=b_{i-1}\)。

试求出\(l,r\)的值。

题解:

可以看到,对计算有贡献的只有\(b\)中出现连续的4个相同数字的情况。

通过这些情况,我们可以确定\(l,r\)的范围,进而求出\(l,r\)的可能值。

因为题目保证有解,只需输出最极端的值(\(l_{min},r_{max}\))即可。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  5. int n,ansll=-1000000000,ansrr=1000000000;
  6. int a[100001];
  7. char b[100009];
  8. int main(){
  9. scanf("%d",&n);
  10. F(i,1,n) scanf("%d",a+i);
  11. scanf("%s",b+1);
  12. F(i,5,n){
  13. if(b[i-4]==b[i-3]&&b[i-3]==b[i-2]&&b[i-2]==b[i-1]){
  14. if(b[i-1]=='0'){
  15. int x=max(max(max(max(a[i],a[i-1]),a[i-2]),a[i-3]),a[i-4]);
  16. if(b[i]=='1'){
  17. //l > max(a 1~5)
  18. ansll=max(ansll,x+1);
  19. }
  20. }
  21. else{
  22. int x=min(min(min(min(a[i],a[i-1]),a[i-2]),a[i-3]),a[i-4]);
  23. if(b[i]=='0'){
  24. //r < min(a 1~5)
  25. ansrr=min(ansrr,x-1);
  26. }
  27. }
  28. }
  29. }
  30. printf("%d %d",ansll,ansrr);
  31. return 0;
  32. }

【E】Cashback

题意:

给定一个长度为\(n\)的数组\(a\)和一个常数\(c\)。你可以把\(a\)数组分割成连续的若干段,每一段的代价分别计算:

对于长度为\(len\)的一段,其代价为其元素总和,减去最小的\(\left \lfloor \frac{len}{c} \right \rfloor\)个元素。

求最小总代价。

题解:

既然要让代价最小,我们转化为求最大的价值,再用所有的元素和减去这个价值即可。

那就变成了长度为\(len\)的一段,其价值为最小的\(\left \lfloor \frac{len}{c} \right \rfloor\)个元素的和。

首先我们注意到一个结论:有贡献价值的分段,其长度正好为\(c\)时,没有其他方法比它更优。

证明请自行脑补……因为我也没想清楚,当时考场上瞎猜的结论,有兴趣的读者不妨看看http://www.cnblogs.com/kkkkahlua/p/8468896.html

那么,我们通过单调队列处理出每个长为\(c\)的区间的最小值,记为\(b\)数组。

那么有DP方程\(f[i]=(max_{j=1}^{i-c}f[i])+b[i-c+1]\),表示前\(i\)个数,最后一个区间必须选取的最大价值,答案为\(Sum-max(f[i])\)。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. #define F(i,a,b) for(int i=(a);i<=(b);++i)
  5. #define ll long long
  6. int n,c;
  7. int a[100009],b[100009];
  8. int que[100009],l=1,r=0;
  9. ll sum,f[100009],g[100009];
  10. int main(){
  11. scanf("%d%d",&n,&c);
  12. F(i,1,n) scanf("%d",a+i);
  13. F(i,1,n) sum+=a[i];
  14. if(c>n) {printf("%lld",sum); return 0;}
  15. F(i,1,c){
  16. while(l<=r&&a[que[r]]>=a[i]) --r;
  17. que[++r]=i;
  18. } b[1]=a[que[l]];
  19. F(i,c+1,n){
  20. if(que[l]<=i-c) ++l;
  21. while(l<=r&&a[que[r]]>=a[i]) --r;
  22. que[++r]=i;
  23. b[i-c+1]=a[que[l]];
  24. }
  25. F(i,1,n-c+1){
  26. if(i<=c) f[i]=b[i];
  27. else{
  28. f[i]=b[i]+g[i-c];
  29. }
  30. g[i]=max(g[i-1],f[i]);
  31. }
  32. printf("%lld",sum-g[n-c+1]);
  33. return 0;
  34. }

【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)的更多相关文章

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

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

  2. 竞赛题解 - CF Round #524 Div.2

    CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...

  3. Codeforces Round #466 (Div. 2) E. Cashback

    Codeforces Round #466 (Div. 2) E. Cashback(dp + 贪心) 题意: 给一个长度为\(n\)的序列\(a_i\),给出一个整数\(c\) 定义序列中一段长度为 ...

  4. CF Round #551 (Div. 2) D

    CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...

  5. CF Round #510 (Div. 2)

    前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...

  6. CF Round #600 (Div 2) 解题报告(A~E)

    CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...

  7. Codeforces Round #466 (Div. 2) -A. Points on the line

    2018-02-25 http://codeforces.com/contest/940/problem/A A. Points on the line time limit per test 1 s ...

  8. cf Round#273 Div.2

    题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一 ...

  9. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

随机推荐

  1. linux shell 执行命令顺序

    1.shell命令搜索顺序 在linux shell 中输入一个命令,如果有多个同名指令,shell需要按照一定规则去取优先级高的一个执行,shell命令的搜索顺序为: 1.别名,使用alias创建的 ...

  2. P2303 [SDOi2012]Longge的问题

    题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). 输入输出格式 输入格式: 一 ...

  3. expect ssh 自动登录 example

    #!/usr/bin/expect -f set ip [lindex $argv ] set port [lindex $argv ] set username [lindex $argv ] se ...

  4. Vue使用SCSS进行模块化开发

    原文地址:http://www.cnblogs.com/JimmyBright/p/7761531.html 个人认为scss最大的好处就是能将css属性设置为变量,这样让css一键更换主题成为可能. ...

  5. Vue里边接口访问Post、Get

    原文地址: http://www.cnblogs.com/JimmyBright/p/7356502.html 通常js里面都用ajax来和服务器交换数据,Vue里边当然也可以用ajax,ajax是基 ...

  6. uoj318 [NOI2017]蔬菜 【贪心 + 堆 + 并查集】

    题目链接 uoj 题解 以前看别人博客,在考场上用费用流做,一直以为这题是毒瘤网络流题 没想到竟然是贪心模拟题... 如果只有一个蔬菜呢?这就是一个经典的普及难度的贪心,正着推面临优先选择的困难,而逆 ...

  7. 解题:POI 2008 Plot purchase

    题面 原来看过然后没做,结果板板把这道题改了改考掉了,血亏=.= 首先看看有没有符合条件的点.如果没有开始寻找解,先把所有的大于$2*k$的点设为坏点,然后求最大子矩形,只要一个最大子矩形的权值和超过 ...

  8. OpenCV入门指南----人脸检测

    本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸 ...

  9. web页面的绝对路径

    在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:一.使用${pageContext.request ...

  10. 四、java面向对象编程_2

    目录 六.对象的创建和使用 七.this关键字 八.static关键字 九.package和import语句 十.类的继承 十一.访问控制 十二.方法的重写 十三.super关键字 十四.继承中的构造 ...