专栏文章

题解十二:P13500 「Cfz Round 6」Kyu-kurarin

P13500题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minxc8e5
此快照首次捕获于
2025/12/02 09:53
3 个月前
此快照最后确认于
2025/12/02 09:53
3 个月前
查看原文

题意

一个正整数序列 aa,进行 ss 次操作,每次将 kk 个数增加 11,求出最大的 ss 使得序列中的每一项满足 ais>0a_i-s>0

思路

本题的答案显然具有单调性。所以,二分答案
对于一个 ss,要判断它是否满足要求,我们就需要对原序列的每一项 aia_i 进行判断:如果不满足 ais>0a_i-s > 0,就需要增加 aia_i 直到满足,并把这个增加量增加到一个变量 numnum 中。(显然,如果一项本身就满足条件便不需要增加。)最后,numnum 就记录了使得整个序列满足条件的总增加量。由题意可知,ss 次操作最多可以增加 s×ks \times k 次。若满足 nums×knum \le s \times kss 符合题意,反之不符合。
CPP
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;
}
s-a[i]+1 的含义
ais>0a_i-s > 0 可以得出 ai>sa_i > s 时该项满足条件。
反过来,当 aisa_i \le s 时不满足条件,需要增加。显然把 aia_i 增加到 s+1s+1 就可以满足条件。而 s+1s+1aia_i 相减的差(即 aia_i 的“增加量”)便是 sai+1s-a_i+1。(好像是句废话。)
若是该项本身就满足 ai>sa_i > s,那么 sai+1s-a_i+1 的结果便是非正数。使用 max() 在该式与 00 中取最大值即可。

代码

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 条评论,欢迎与作者交流。

正在加载评论...