开始一看题目的时候,就想着二分时间,然后看可不可行。然后在写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;
}