首页 > 代码库 > poj 3104
poj 3104
/* 题意: 有n个衣服,每个衣服都有一个数值a[i],代表它的含水量。 你要把所有衣服晾干,有两种方法: 1.自然晾晒,每秒少1水 2.风干机,每秒少k水,不足k则变为0,但是同一时间只可以风干一件衣服。 求把所有衣服风干的最短时间。 我们可以枚举时间mid。 判断是否可以满足在mid时间内让所有的都变为0,如果可以,那么最终答案肯定<=mid,否则>mid。 判断是否可以让mid满足: 对于每个衣服,假如a[i]<=mid,那么自然风干就可以了,否则需要使用机器。 我们可以使用贪心的策略来使用机器,对于衣服,可以使用机器t秒,然后自然风干,让总时间<=mid就可以了。 t*k + mid - t >= a[i] 有t >= (a[i] - mid)(k-1) k=1则之间输出a[i]最大的就可以了 k!=1,t = ceil(....) 把每个衣服的t加起来,就是风干机需要使用的总时间,如果不大于mid,那么满足条件,否则不行。*/#include <iostream>#include <cstdio>#include <cmath>#define range(i,a,b) for (int i=a;i<=b;i++)using namespace std;const int maxn = 100000;int a[maxn+1];int n,k;bool check(int val){ int sum(0); range(i,1,n) if (a[i] <= val) { continue; } else { sum += ceil((double)(a[i]-val) / (k-1)); if (sum > val) return 0; } return sum <= val;}int main(){ scanf("%d",&n); int L(0),R(0); range(i,1,n) { scanf("%d",&a[i]); R = R < a[i] ? a[i] : R; } scanf("%d",&k); if (k == 1) { cout<<R<<endl; return 0; } range(c,1,100) { int mid = (L+R) >> 1; if (check(mid)) { R = mid; } else { L = mid; } } if (check(L)) cout<<L<<endl; else cout<<L+1<<endl; return 0;}
poj 3104
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。