1. 通过邻项交换法可知,怨气值大的孩子分得的饼干数也应该多(否则交换之后得到的解更优)。
  2. 观察目标函数的性质,可知目标函数本身是由孩子饼干数的相对大小得到,因此此题中关注的是相对大小。

状态设计:\(dp[i][j]\)表示前 i 个人分 j 个饼干的最小怨气值。(i,j)是问题的阶段

另外,在处理路径输出时,还是通过递归的操作,不过,这里是在递归时生成答案。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=31;
const int maxm=5001; int dp[maxn][maxm],ans[maxn];
int n,m,num[maxn],sum[maxn];
struct node{
int n,m;
}pre[maxn][maxm];
struct child{
int g,idx;
}ch[maxn]; bool cmp(const child& x,const child& y){return x.g>y.g;} void read_and_parse(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&ch[i].g),ch[i].idx=i; sort(ch+1,ch+n+1,cmp);//贪心
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
} void work(int i,int j){
if(!i)return; work(pre[i][j].n,pre[i][j].m); if(pre[i][j].n==i)for(int k=1;k<=i;k++)ans[ch[k].idx]++;
else for(int k=pre[i][j].n+1;k<=i;k++)ans[ch[k].idx]=1;
} void solve(){
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+ch[i].g;//前缀和优化
for(int j=i;j<=m;j++){
dp[i][j]=dp[i][j-i];
pre[i][j]=(node){i,j-i};
for(int k=0;k<i;k++){
if(dp[i][j]>dp[k][j-(i-k)]+k*(sum[i]-sum[k])){
dp[i][j]=dp[k][j-(i-k)]+k*(sum[i]-sum[k]);
pre[i][j]=(node){k,j-(i-k)};
}
}
}
}
printf("%d\n",dp[n][m]);
work(n,m);
for(int i=1;i<=n;i++)printf("%d%c",ans[i],i==n?'\n':' ');
} int main(){
read_and_parse();
solve();
return 0;
}

【CH5105】cookies 贪心+DP的更多相关文章

  1. $CH5105\ Cookies$ 线性$DP+$贪心

    CH 是很有趣的一道题 : ) Sol 第一反应就是f[i][j]表示前i个小朋友分j块饼干的最小怨气值 但是一个孩子所产生的怨气值并不固定,它与其他孩子获得饼干的情况有关 这里可以用到一个贪心,就是 ...

  2. CH5105 Cookies[线性DP]

    http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%B ...

  3. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  4. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...

  5. 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp

    正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...

  6. 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp

    题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...

  7. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...

  8. hdu 1257 最少拦截系统【贪心 || DP——LIS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  9. 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人

    P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...

随机推荐

  1. Unity3D安卓打包

    Unity3D安卓打包须知: 最近在接触Unity3D,在打包安卓时,出现了一些问题,在这里写出来跟大家分享: 首先需要安装jdk和android-sdk,安装方法略 Jdk的目录结构如下: andr ...

  2. json模块 & pickle模块

    之前学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所 ...

  3. 基于Nginx+Keepalived的LB服务监控(邮件报警)

    IDC两台机器上部署了Nginx+Keepalived主从模式的LB代理负载层,现在需要对LB进行每日巡检和服务监控,利用SendEmail邮件监控. 0)SendEmail部署 参考:http:// ...

  4. C_数据结构_循环队列

    # include <stdio.h> # include <malloc.h> typedef struct Queue { int * pBase; int front; ...

  5. Python-集合-17

    ''' 集合:可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复. {} ''' set1 = set({1,2,3}) # set2 = {1,2,3,[2,3],{'name':'a ...

  6. 作业20171102 beta1 成绩

    申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月12日 17:00. 成绩 scrum01 scrum02 scrum03 scrum04 scrum05 sc ...

  7. Proxy基础---------获取collection接口的构造跟方法

    1----查看proxy api 2------测试代码 package cn.proxy01; import java.lang.reflect.Constructor; import java.l ...

  8. centos7编译安装zabbix的错误

    [Z3001] connection to database 'zabbix' failed: [2002] Can't connect to local MySQL server through s ...

  9. PAT 1033 旧键盘打字

    https://pintia.cn/problem-sets/994805260223102976/problems/994805288530460672 旧键盘上坏了几个键,于是在敲一段文字的时候, ...

  10. 震旦199打印机扫描A4文件

    1.需要扫描的A4文件放入输稿器 2.使用数据线将打印机.电脑连接 3.在电脑中右键打印机,选择扫描功能 4.如下图,选择选项后,点击扫描即可