POJ - 3104 Drying 二分 + 贪心

来源:互联网 发布:横截面数据是指同一 编辑:程序博客网 时间:2024/04/30 09:49

题目大意:有n件湿的衣服,每件衣服都有相应的湿度,每分钟每件衣服的湿度减1(除了在烘干机里的衣服),现在有一个烘干机,烘干机一分钟可以让一件衣服的湿度降低k,问至少要花多少分钟才能使每件衣服的湿度为0

解题思路:贪心的话,每分钟都要使用到烘干机。
枚举时间,如果湿度小于等于时间的话,就不用考虑了,在枚举时间内肯定会干的
如果湿度大于枚举时间的话,就要考虑一下了,该衣服要在给定时间内湿度变为零的话就要满足该式子,设已经过了cnt分钟了,当前这件衣服的湿度为num[i],枚举的时间为mid,那么
(num[i] - cnt) - n * k <= mid - cnt - n
也就是n =(num[i] - cnt) / (k - 1),如果有余数的话,时间还要加一

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 100010int num[maxn], n, k, Max;bool cmp(const int a, const int b) {    return a > b;}bool judge(int mid) {    int cnt = 0;    for(int i = 0; i < n; i++) {        if(num[i] <= mid)            break;        if(cnt > mid)            return false;        cnt += (num[i] - mid ) / (k - 1);        if((num[i] - mid) % (k - 1))            cnt++;    }    return cnt <= mid;}int solve() {    int l = 0, r = Max;    while(l < r ) {        int mid = (l + r) / 2;        if(judge(mid))            r = mid;        else            l = mid + 1;    }    return r;}int main() {    while(scanf("%d", &n) != EOF) {        Max = -1;        for(int i = 0; i < n; i++) {            scanf("%d", &num[i]);            Max = max(Max, num[i]);        }        sort(num, num + n, cmp);        scanf("%d", &k);        if(k <= 1) {            printf("%d\n", num[0]);            continue;        }        printf("%d\n", solve());    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网上购票待核验怎么办 老人坐飞机找不到登机口怎么办 儿童不能值机怎么办 飞机上旅客刁难怎么办 飞机上婴儿哭闹怎么办 飞机上婴儿啼哭怎么办 飞机儿童陪护手续怎么办 孕妇感冒鼻子堵怎么办 孕妇用了眼药水怎么办 孕妇用眼药水了怎么办 错过了登机时间怎么办 过了登机时间怎么办 孩子不喜欢做作业怎么办 宝宝腿不一样粗怎么办 一个小腿肿了怎么办 左右小腿不一样粗怎么办 小孩不敢自己睡怎么办 小孩不一个人睡怎么办 晚上一个人睡觉害怕怎么办 孩子自己睡害怕怎么办 小孩晚上睡觉怕怎么办 小孩分房睡害怕怎么办 坐飞机不认识字怎么办 科目一不识字怎么办 孩子不自己睡觉怎么办 70岁老人坐高铁怎么办 八岁儿童怎么办护照 第一次坐飞机有点紧张怎么办 坐飞机恐高耳鸣怎么办 火车坐过站怎么办 凌晨的火车应该怎么办 高铁坐过一站怎么办 宝宝断奶瘦了怎么办 第一次坐飞机怕晕机怎么办 焦虑症怕坐飞机怎么办 新生宝宝老是哭闹怎么办 宝宝坐飞机后哭闹怎么办 飞机经济舱不支持退票怎么办 证件被单位扣押怎么办 小孩高烧41度怎么办 国际航班未成年托管怎么办手续