【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)
人生的大起大落莫过如此,下一场我一定要回紫。

【A】Points on the line
题意:
一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\)。
题解:
暴力两重for,更新答案。
#include<cstdio>
#include<algorithm>
using namespace std;
#define F(i,a,b) for(int i=(a);i<=(b);++i)
int n,q,ans=0;
int a[100001];
int main(){
scanf("%d%d",&n,&q);
F(i,1,n) scanf("%d",a+i);
sort(a+1,a+n+1);
F(i,1,n){
int xx=a[i], kk=-1;
F(j,i,n){
if(a[j]-xx>q) break;
kk=j;
}
ans=max(ans,kk-i+1);
}
printf("%d",n-ans);
return 0;
}
【B】Our Tanya is Crying Out Loud
题意:
一个数\(n\),每次你可以花费\(A\)的代价把它除以\(k\)(如果\(k|n\)),或者花费\(B\)的代价把它减一。问把这个数变成1的最少代价。
题解:
暴力上,不能除减到能除为止,能除看是除了花费少还是不除花费少。
注意特判\(k=1\)。
#include<cstdio>
#define ll long long
int n,k,A,B;
ll ans;
int main(){
scanf("%d%d%d%d",&n,&k,&A,&B);
if(k==1) {printf("%lld",(ll)(n-1)*A);return 0;}
while(n!=1){
int x=n/k*k;
if(x==0) {ans+=(ll)(n-1)*A; break;}
if(n!=x) ans+=(ll)(n-x)*A, n=x;
else{
x=n/k;
if((ll)(n-x)*A<=B) ans+=(ll)(n-x)*A;
else ans+=B;
n=x;
}
}
printf("%lld",ans);
return 0;
}
【C】Phone Numbers
题意:
限定字符集,求长度为\(k\)的,字典序比给定长度为\(n\)的字符串大的最小的字符串。
题解:
①\(k>n\)时,在原串后补上最小的字符。
②\(k<=n\)时,答案为原串的前\(k\)位+1,即比原串\(k\)位前缀大的第一个字符串。
#include<cstdio>
#define F(i,a,b) for(int i=(a);i<=(b);++i)
#define F2(i,a,b) for(int i=(a);i<(b);++i)
int n,k,tot;
int px[150];
bool used[150];
char str[100010],use[30];
char ans[100010];
int main(){
scanf("%d%d",&n,&k);
scanf("%s",str);
F2(i,0,n) used[str[i]]=1;
F(i,1,140) if(used[i]) use[++tot]=i;
F(i,1,tot) px[use[i]]=i;
if(k>n){
printf("%s",str);
F(i,n+1,k) printf("%c",use[1]);
return 0;
}
F2(i,0,k) ans[i]=str[i]; ans[k]='\0';
int x=k-1;
while(px[ans[x]]==tot){
ans[x]=use[1];
--x;
}
ans[x]=use[px[ans[x]]+1];
printf("%s",ans);
return 0;
}
【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}\))即可。
#include<cstdio>
#include<algorithm>
using namespace std;
#define F(i,a,b) for(int i=(a);i<=(b);++i)
int n,ansll=-1000000000,ansrr=1000000000;
int a[100001];
char b[100009];
int main(){
scanf("%d",&n);
F(i,1,n) scanf("%d",a+i);
scanf("%s",b+1);
F(i,5,n){
if(b[i-4]==b[i-3]&&b[i-3]==b[i-2]&&b[i-2]==b[i-1]){
if(b[i-1]=='0'){
int x=max(max(max(max(a[i],a[i-1]),a[i-2]),a[i-3]),a[i-4]);
if(b[i]=='1'){
//l > max(a 1~5)
ansll=max(ansll,x+1);
}
}
else{
int x=min(min(min(min(a[i],a[i-1]),a[i-2]),a[i-3]),a[i-4]);
if(b[i]=='0'){
//r < min(a 1~5)
ansrr=min(ansrr,x-1);
}
}
}
}
printf("%d %d",ansll,ansrr);
return 0;
}
【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])\)。
#include<cstdio>
#include<algorithm>
using namespace std;
#define F(i,a,b) for(int i=(a);i<=(b);++i)
#define ll long long
int n,c;
int a[100009],b[100009];
int que[100009],l=1,r=0;
ll sum,f[100009],g[100009];
int main(){
scanf("%d%d",&n,&c);
F(i,1,n) scanf("%d",a+i);
F(i,1,n) sum+=a[i];
if(c>n) {printf("%lld",sum); return 0;}
F(i,1,c){
while(l<=r&&a[que[r]]>=a[i]) --r;
que[++r]=i;
} b[1]=a[que[l]];
F(i,c+1,n){
if(que[l]<=i-c) ++l;
while(l<=r&&a[que[r]]>=a[i]) --r;
que[++r]=i;
b[i-c+1]=a[que[l]];
}
F(i,1,n-c+1){
if(i<=c) f[i]=b[i];
else{
f[i]=b[i]+g[i-c];
}
g[i]=max(g[i-1],f[i]);
}
printf("%lld",sum-g[n-c+1]);
return 0;
}
【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)的更多相关文章
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- Codeforces Round #466 (Div. 2) E. Cashback
Codeforces Round #466 (Div. 2) E. Cashback(dp + 贪心) 题意: 给一个长度为\(n\)的序列\(a_i\),给出一个整数\(c\) 定义序列中一段长度为 ...
- 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 #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 ...
- cf Round#273 Div.2
题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一 ...
- 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)
终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...
随机推荐
- nilcms file类 简单文件缓存实现
实现简单的文件缓存,参照CI的部分设计,在这里记录一下子. class File { const CACHE_PATH = 'nil_file_cache'; /*其他函数省略了*/ /** * 获取 ...
- Angular 动态组件
Angular 动态组件 实现步骤 Directive HostComponent 动态组件 AdService 配置AppModule 需要了解的概念 Directive 我们需要一个Directi ...
- BZOJ5102 POI2018Prawnicy(堆)
考虑固定右端点,使左端点最小.那么按右端点排序后查询前缀这些区间的左端点第k小即可.然而写了一个treap一个线段树都T飞了,感觉惨爆.事实上可以用堆求第k小,维护一个大根堆保证堆中元素不超过k个即可 ...
- 题解 CF1005A 【Tanya and Stairways】
楼上别说这个题水,这个题可能还真有不知道的知识点. 看到这个题,想到刚学的单调栈. 单调栈? 单调栈和单调队列差不多,但是我们只用到它的栈顶. 单调,意思就是一直递增或者递减. 这跟这个题有什么关系? ...
- P4910 帕秋莉的手环
题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...
- MT【147】又见最大最小
(2018浙江省赛12题)设$a\in R$,且对任意的实数$b$均有$\max\limits_{x\in[0,1]}|x^2+ax+b|\ge1$求$a$的范围_____解答:由题意$\min\li ...
- BZOJ 4408: [Fjoi 2016]神秘数
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 464 Solved: 281[Submit][Status ...
- 【转】查看 Linux 发行版名称和版本号的 8 种方法
如果你加入了一家新公司,要为开发团队安装所需的软件并重启服务,这个时候首先要弄清楚它们运行在什么发行版以及哪个版本的系统上,你才能正确完成后续的工作.作为系统管理员,充分了解系统信息是首要的任务. 查 ...
- D. Vitya and Strange Lesson Codeforces Round #430 (Div. 2)
http://codeforces.com/contest/842/problem/D 树 二进制(路径,每个节点代表一位) #include <cstdio> #include < ...
- linux expect 的使用
expect 可以让一些需要交互的命令自动完成,如 ssh 连接的适合需要输入密码. 也就是说,某些重复的操作我们可以使用该命令完成,比如 ssh 连接到服务器,然后进到某个项目目录,进行 git 的 ...