POJ3104 Drying 二分搜索

来源:互联网 发布:大学生借钱的软件 编辑:程序博客网 时间:2024/04/29 21:43

        题目大意是:Jane洗完N件衣服,每件衣服含水量ai,每一分种,这些衣服的水量都会减少1个单位,为了加快时间让这些衣服都晾干,Jane使用了烘干机,但是烘干机每分钟只能烘一件衣服,每分钟烘干机会使这件衣服减少k水分(减到0后不会继续减了)。计算出总共最少需要花多少时间才能晾干所有衣服。

        二分搜索,设C(x):=x分钟内能将这些衣服全部晾干。至于如何判断C(x)成立,首先可以知道确定了x,那么烘干机也最多能用x分钟。我们只要依次对每一件衣服进行判断,当ai > x时,那这件衣服是肯定需要烘干机进行帮助的,然后该衣服需要烘干机的时间为 ceil((ai - x) / (k - 1)),注意分母是k-1不是k。到这里就可以编码了。

#include <stdio.h>#include <vector>#include <math.h>#include <string.h>#include <string>#include <iostream>#include <queue>#include <list>#include <algorithm>#include <stack>#include <map>using namespace std;int cost[100001];bool CC(int x, int n, int k){int left = x;for (int i = 0; i < n;i++){if (cost[i] > x){left -= (ceil((cost[i] - x) / (double)(k - 1)));}if (left < 0){return false;}}return true;}int main(){#ifdef _DEBUGfreopen("e:\\in.txt", "r", stdin);#endifint n,k;scanf("%d\n", &n);int maxtime = 0;for (int i = 0; i < n;i++){scanf("%d", &cost[i]);if (maxtime < cost[i]){maxtime = cost[i];}}scanf("%d", &k);int l = 0;int r = maxtime + 1;while (r - l > 1){int mid = (r + l) / 2;if (CC(mid, n, k)){r = mid;}elsel = mid;}printf("%d\n", r);return 0;}


0 0
原创粉丝点击