网课:第四章二分、三分、01分数规划---[USACO 2010 Feb S]Chocolate Eating

本文主要是介绍网课:第四章二分、三分、01分数规划---[USACO 2010 Feb S]Chocolate Eating,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

贝西收到了N(1 <= N <= 50,000)块巧克力,但她不想吃得太快,因此她想为接下来的D(1 <= D <= 50,000)天制定巧克力食用计划,以便在那些天中最大化她的最低幸福水平。 贝西的幸福水平是一个整数,起始值为0,在夜间睡觉时减半(如果必要的话向下取整)。然而,当她吃掉第i块巧克力时,她的幸福水平增加了整数 Hi (1 <= Hi <= 1,000,000)。如果她在一天中吃了巧克力,她当天的幸福被认为是她吃巧克力后的幸福水平。贝西坚持按照她收到的顺序吃巧克力。 如果存在多个最优解,打印其中任何一个。 将一系列5块巧克力视为在5天内食用的一段时间; 它们分别带来幸福(10、40、13、22、7)。 如果贝西在第一天吃第一块巧克力(10幸福)然后等待吃其他的,那么她在第一天后的幸福水平是10。


 

输入

第1行:两个用空格分隔的整数:N 和 D

第2行到第N+1行:每行包含一个整数: Hi

5 5 
10 
40 
13 
22 
7

输出

第1行:一个整数,贝西在接下来的D天内最高的最小幸福水平

第2行到第N+1行:每行包含一个整数,表示贝西吃掉巧克力i的日期

24
1
1
3
4
5

做法

最小值最大,典型的二分答案。

#include<bits/stdc++.h>
using namespace std;
int n,d;
int isleft(long long num,vector<int> &v){long long res=0;int cnt=0;for(int i=1;i<=d;i++){while(res<num&&cnt<n){res+=v[cnt++];}if(res<num) return 0;res/=2;}return 1;
}
int main(){scanf("%d%d",&n,&d);vector<int> v(n);//开心值vector<int> g(n);long long sum=0;//总开心值for(int i=0;i<n;i++){scanf("%d",&v[i]);sum+=v[i];}long long l=-1,r=sum+1;while(l+1<r){long long mid=l+(r-l)/2;if(isleft(mid,v)) l=mid;else r=mid;}long long res=0;int cnt=0;cout<<l<<endl;for(int i=1;i<=d;i++){while(res<l&&cnt<n){g[cnt]=i;res+=v[cnt++];}res/=2;}for(int i=0;i<n;i++) {if(g[i])cout<<g[i]<<endl;else cout<<d<<endl;//没吃完}}

wa的原因

1.弄错了题意,isleft函数的条件写错了

2.没开long long

3.没关注到巧克力没吃完的情况,有想到,但后面没怎么管,看题解才发现真有这种情况

这篇关于网课:第四章二分、三分、01分数规划---[USACO 2010 Feb S]Chocolate Eating的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987733

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

usaco 1.3 Calf Flac(暴搜)

思路是暴搜。 需要注意的地方是输入的方法,以及输出时的换行。 代码: /*ID: who jayLANG: C++TASK: calfflac*/#include<stdio.h>#include<string.h>#include<math.h>int main(){freopen("calfflac.in","r",stdin);freopen("calfflac.ou

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

usaco 1.2 Milking Cows(类hash表)

第一种思路被卡了时间 到第二种思路的时候就觉得第一种思路太坑爹了 代码又长又臭还超时!! 第一种思路:我不知道为什么最后一组数据会被卡 超时超了0.2s左右 大概想法是 快排加一个遍历 先将开始时间按升序排好 然后开始遍历比较 1 若 下一个开始beg[i] 小于 tem_end 则说明本组数据与上组数据是在连续的一个区间 取max( ed[i],tem_end ) 2 反之 这个