奶牛晒衣服
标准的二分答案
传送门(洛谷)
题目描述
此题一眼看来是可以用贪心思想的,但我主要讲述的是二分答案
二分标准模版:
while(l<=r)
{
ll mid=(l+r)/2;
if(check(mid)) r=mid-1//如果在mid时间内可以,则向右缩短时间(不用我阐述为啥吧)
else l=mid+1;
}
每次我门二分在mid时间内能否将所有衣服烘干,具体讲述见注释
/**********************************
* Problem LOG P1843 奶牛晒衣服
* Time 2019.3.23
* User mzg1824_TY
* Algorithm 二分答案
**********************************/
#include<bits/stdc++.h>
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define ll long long
using namespace std;
const int maxn=1e6+10;
ll n,a,b;
ll c[maxn],l=0,r;
template <class t> void read(t &x)
{
x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();}
x*=f;
}
void readdata()
{
read(n),read(a),read(b);
rep(i,1,n) read(c[i]),r+=c[i];//r的最值就是所有衣服全水分值部自然干
}
bool check(ll x)
{
ll h=0;
for(int i=1;i<=n;i++)
{
if(c[i]-a*x>0)
{
if((c[i]-a*x)%b==0) h+=(c[i]-a*x)%b;//这里我们判断一下,在自然风干后用烘干机是否恰好烘干
else h+=(c[i]-a*x)/b+1;//否则多用一次
}
}
if(h<=x) return true;
else return false;
}
void work()
{
while(l<=r)
{
ll mid=(l+r)/2;
if(check(mid)) r=mid-1;
else l=mid+1;
}
printf("%lld",l);
}
int main()
{
freopen("input.txt","r",stdin);
readdata();
work();
return 0;
}