Loading

Solutions P1843 奶牛晒衣服

思路

最小的时间显然具有单调性并且严格递减,所以我们二分答案这个时间即可,我们要贪心怎么贪心呢就是尽可能的晒干湿度越高的衣服就可以了这样我们的时间复杂度是\(\Theta(n \log w)\)的。

实现

check是大概这么写的

auto ok = [&](ll X) -> bool {
        ll need = 0;
		for (int i = 0; i < n; i++) {
			if (RH[i] > (ll)a * X) {
				need += (RH[i] - (ll)a * X + b - 1) / b;
			}
		}
		return need <= X;
};

由于输入不保证具有单调性所以我们还要排序,排序之后二分答案即可。
AClink

ACcode

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define i128 __int128
#define ld long double
#define fir first
#define sec second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define lowbit(x) (x&-x)
using namespace std;
const int MOD=998244353;
const int MOD1=1e9+7;
//char ibuf[1<<25],*p1=buf,*p2=buf;
mt19937 mrand(random_device{}());
int rnd(int x){ return mrand() % x;}
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1)res=res*a%MOD;a=a*a%MOD,b>>=1;}return res;}
ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}  
ll lcm(ll a,ll b){ return a/gcd(a,b)*b;}
//C++ 17 -O2
//By MaZhaoze
int main(){
	ios::sync_with_stdio(0);
    cin.tie(0);
	int n,a,b;
	cin>>n>>a>>b;
	vector<int> RH(n);
	for(auto &x:RH) cin>>x;
	sort(RH.begin(),RH.end());
	auto ok = [&](ll X) -> bool {
        ll need = 0;
		for (int i = 0; i < n; i++) {
			if (RH[i] > (ll)a * X) {
				need += (RH[i] - (ll)a * X + b - 1) / b;
			}
		}
		return need <= X;
    };

	int l=0,r=5e5+5;
	while(l<r){
		int mid=(l+r)/2;
		if(ok(mid)){
			r=mid;
		}else{
			l=mid+1;
		}
	}
	cout<<l;
	return 0;
}
posted @ 2026-02-27 14:32  MagnusSM2  阅读(8)  评论(0)    收藏  举报