专栏文章
题解十二:P13500 「Cfz Round 6」Kyu-kurarin
P13500题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minxc8e5
- 此快照首次捕获于
- 2025/12/02 09:53 3 个月前
- 此快照最后确认于
- 2025/12/02 09:53 3 个月前
题意
一个正整数序列 ,进行 次操作,每次将 个数增加 ,求出最大的 使得序列中的每一项满足 。
思路
本题的答案显然具有单调性。所以,二分答案。
对于一个 ,要判断它是否满足要求,我们就需要对原序列的每一项 进行判断:如果不满足 ,就需要增加 直到满足,并把这个增加量增加到一个变量 中。(显然,如果一项本身就满足条件便不需要增加。)最后, 就记录了使得整个序列满足条件的总增加量。由题意可知, 次操作最多可以增加 次。若满足 则 符合题意,反之不符合。
CPPbool check(ll s){
ll num=0;
for(ll i=1;i<=n;i++){
num+=max((ll)0,s-a[i]+1);
if(num>s*k) return false;
}return true;
}
s-a[i]+1 的含义
由 可以得出 时该项满足条件。
反过来,当 时不满足条件,需要增加。显然把 增加到 就可以满足条件。而 与 相减的差(即 的“增加量”)便是 。(好像是句废话。)
若是该项本身就满足 ,那么 的结果便是非正数。使用
max() 在该式与 中取最大值即可。代码
CPP//1.38s / 8.14MB / C++17 O2
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll n,k,l,r=1e12,mid,ans,a[1000010];
bool check(ll s){
ll num=0;
for(ll i=1;i<=n;i++){
num+=max((ll)0,s-a[i]+1);
if(num>s*k) return false;
}return true;
}
int main(){
// freopen("ice4.in","r",stdin);
cin>>n>>k;
for(ll i=1;i<=n;i++) cin>>a[i];
while(l<r){
mid=(l+r)/2+1;
if(check(mid)) l=mid;
else r=mid-1;
}cout<<l;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...