您的位置:首页 > 其它

POJ 3104 Drying (二分求最小值)

2017-04-20 21:20 141 查看
开始一看题目的时候,就想着二分时间,然后看可不可行。然后在写ok判断可不可行的时候,莫名的感觉不用二分

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;
const int maxn = 100005;
int n,k;
int a[maxn];
bool cmp(int a1,int b2)
{
return a1>b2;
}
void ok()
{
int temp=a[0];
int time=0;
int i=1;
while(i<n)
{
while(temp-k<0)
{
if(i>=n) break;
temp+=(a[i]-time);
i++;
}
temp-=k;
time++;
}
if(temp>0) time++;
printf("%d\n",time);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
sort(a,a+n,cmp);
ok();
return 0;
}


然后WA到想哭。之后发现出了问题,1.题目中说了一分钟内只能放一件衣服进烘干机,,我这里想的是一分钟内干了后,拿出来再放别的。(额。。更节约。。)。2.改好了之后,先将水多的放进烘干机,然后把时间记下来,后面如果有自然干的时间大于这个时间的话,就放进烘干机,更新时间。但是这个又有点问题,水多的有可能一部分时间在烘干机里,一部分在外面自然烘干时间更短。

然后还是老实的二分吧

//注意转long long ~~~~

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;
const int maxn = 100005;
long long n,k;
long long a[maxn];
bool cmp(long long a1,long long b1)
{
return a1>b1;
}
int ok(long long time)
{
long long cnt=0;
long long i=0;
for(i=0;i<n;i++)
{
if(a[i]<=time) break;
else {
cnt+=(a[i]-time+k-2)/(k-1);//假设全部自然烘干,然后放烘干机里的就是k-1
}
}
if(cnt>time)  return 1;
else return 0;
}
int main()
{
scanf("%I64d",&n);
for(long long i=0;i<n;i++){
scanf("%I64d",&a[i]);r+=a[i];
}
scanf("%I64d",&k);
sort(a,a+n,cmp);
if(k==1) cout<<a[0]<<endl;
else{
long long l=0, r=a[0];
while(l<=r)
{
long long mid=l+(r-l)/2;
if(ok(mid)) l=mid+1;
else r=mid-1;
}
cout<<l<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: