ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

洛谷 P2985 Chocolate Eating S 题解

洛谷 P2985 Chocolate Eating S 题解 题意梳理有 N 块巧克力必须按顺序吃一共 D 天。幸福值初始cur0每晚睡觉后幸福值向下取整减半。某天吃若干巧克力吃完巧克力后的幸福值就是当天的幸福值。目标最大化D 天中每天睡前幸福值的最小值最大化最小值经典二分答案模型。输出最大的最低幸福值输出每一块巧克力在哪一天吃掉。注意数据范围很大所以总和可以很大要用long long防止溢出。核心思想二分答案“最大化最小值” 标准套路二分判定答案 midcheck(x)函数判断是否存在吃巧克力方案保证每一天结束时幸福值都≥x并且全部巧克力在 D 天内按顺序吃完。如果check(x)true说明可以做到每天最低至少 x尝试找更大记录方案二分右边界lmid1。如果check(x)false做不到只能往小找rmid‑1。二分范围l0rtext所有巧克力幸福总和。check函数完整解析boolcheck(longlongx){longlongcur0,s0;//cur当前幸福s已经吃掉的巧克力块数for(inti1;id;i)//枚举第i天{cur/2;//睡一觉前一天晚上幸福减半来到新一天起床//只要今天结束幸福还达不到x就继续吃巧克力按顺序while(curxsn){s;cura[s];b[s]i;//记录第s块巧克力是第i天吃}if(curx)//今天吃完所有剩下巧克力依旧达不到x → x不可行{returnfalse;}}//循环走完D天剩下没吃完的巧克力全部丢在最后一天d吃for(intis1;in;i){b[i]d;}returntrue;}完整AC代码#includebits/stdc.husingnamespacestd;intn,d;inta[50010],b[50010],c[50010];// check(x): 是否可以保证D天每天结束幸福xboolcheck(longlongx){longlongcur0;ints0;//s:已经吃掉的巧克力数目for(inti1;id;i){cur/2;//睡一晚幸福减半新一天开始//当前幸福不足x继续吃巧克力while(curxsn){s;cura[s];b[s]i;}if(curx)returnfalse;//今天无论如何达不到x}//D天走完剩下全部放最后一天for(intis1;in;i){b[i]d;}returntrue;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);cinnd;longlongsum0;for(inti1;in;i){cina[i];suma[i];}longlongl0,rsum,ans0;while(lr){longlongmid(lr)/2;if(check(mid)){ansmid;copy(begin(b),end(b),begin(c));lmid1;}else{rmid-1;}}coutans\n;for(inti1;in;i){coutc[i]\n;}return0;}
返回列表