链接:

https://www.acwing.com/problem/content/279/

题意:

圣诞老人共有M个饼干,准备全部分给N个孩子。

每个孩子有一个贪婪度,第 i 个孩子的贪婪度为 g[i]。

如果有 a[i] 个孩子拿到的饼干数比第 i 个孩子多,那么第 i 个孩子会产生 g[i]*a[i]的怨气。

给定N、M和序列g,圣诞老人请你帮他安排一种分配方式,使得每个孩子至少分到一块饼干,并且所有孩子的怨气总和最小。

思路:

先考虑贪心,怨气较大的人得到的饼干肯定较多.

可以先进行排序, 再去进行DP, 考虑Dp使没有确定的值.

对于Dp[i,j]表示前i个孩子,共分配j个饼干的情况.

对于第i个孩子, 考虑将其分配大于1个饼干,可以发现将前i个人的饼干数都减一,并不影响答案的数值.

在考虑从i开始往前k个孩子全部分配1个饼干的情况,挨个查找.同时前缀和记录怨气的总值.

而为了找到每个孩子的具体数值.可以用a,b两个数组记录某个状态是由那个状态转移而来.

结束DP之后.递归查找.当某个状态是由孩子个数相同情况推出来的时候.可以将这些孩子的总数诶个加1.

否则可以得到k+1到n这些孩子的饼干数都为1.

其中还用到了神奇的排序...

代码:

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9; int Dp[50][5010];
int G[50];
int Sum[50];
int C[50];
int a[50][5010], b[50][5010];
int Ans[50];
int n, m; bool cmp(int l, int r)
{
return G[l] > G[r];
} void Ser(int n, int m)
{
if (n == 0)
return;
Ser(a[n][m], b[n][m]);
if (a[n][m] == n)
{
for (int i = 1;i <= n;i++)
Ans[C[i]]++;
}
else
{
for (int i = a[n][m]+1;i <= n;i++)
Ans[C[i]] = 1;
}
} int main()
{
scanf("%d%d", &n, &m);
for (int i = 1;i <= n;i++)
scanf("%d", &G[i]), C[i] = i;
for (int i = 0;i <= n;i++)
{
for (int j = 0;j <= m;j++)
Dp[i][j] = INF;
}
sort(C+1, C+1+n, cmp);
Dp[0][0] = 0;
for (int i = 1;i <= n;i++)
{
Sum[i] = Sum[i-1]+G[C[i]];
for (int j = i;j <= m;j++)
{
Dp[i][j] = Dp[i][j-i];
a[i][j] = i;
b[i][j] = 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]);
a[i][j] = k;
b[i][j] = j-(i-k);
}
}
}
}
printf("%d\n", Dp[n][m]);
Ser(n, m);
for (int i = 1;i <= n;i++)
printf("%d ", Ans[i]);
printf("\n"); return 0;
}

Acwing-277-饼干(DP)的更多相关文章

  1. Acwing P277 饼干 题解

    每日一题 day20 打卡 Analysis 线型动态规划 读入每个人的贪婪度之后,对其按照从大到小的顺序排序,定义状态f[i][j]为前i个人(排序后)分j个饼干的答案,那么答案为f[n][m],考 ...

  2. csp-s 考前刷题记录

    洛谷 P2615 神奇的幻方 洛谷 P2678 跳石头 洛谷 P1226 [模板]快速幂||取余运算 洛谷 P2661 信息传递 LOJ P10147 石子合并 LOJ P10148 能量项链 LOJ ...

  3. AcWing 313. 花店橱窗 (线性DP)打卡

    题目:https://www.acwing.com/problem/content/315/ 题意:有一个矩阵,你需要在每一行选择一个数,必须保证前一行的数的下标选择在下一行的左边,即下标有单调性,然 ...

  4. AcWing 312. 乌龟棋 (简单DP)打卡

    题目:https://www.acwing.com/problem/content/description/314/ 题意:有一段路,每个格子都有个价值,然后有m张卡牌,四种类型,走1,2,3,4步, ...

  5. AcWing 233. 换教室 (期望DP+floyd)打卡

    题目:https://www.acwing.com/problem/content/235/ 题意:有n个时间段,这个时间段有两个地方授课ci,di,最开始是在ci,可以申请去di,但是是几率的,然后 ...

  6. AcWing 232. 守卫者的挑战 (期望DP)打卡

    题目:https://www.acwing.com/problem/content/description/234/ 题意:有n次挑战,每次挑战获胜可以得到一个地图碎片值为-1  或者  可以得到一个 ...

  7. Codeforces Round #277 (Div. 2) E. LIS of Sequence DP

    E. LIS of Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/pr ...

  8. codeforces 277.5 div2 F:组合计数类dp

    题目大意: 求一个 n*n的 (0,1)矩阵,每行每列都只有两个1 的方案数 且该矩阵的前m行已知 分析: 这个题跟牡丹江区域赛的D题有些类似,都是有关矩阵的行列的覆盖问题 牡丹江D是求概率,这个题是 ...

  9. Codeforces Round #277 (Div. 2) D. Valid Sets (DP DFS 思维)

    D. Valid Sets time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  10. Codeforces Round #277 (Div. 2)D(树形DP计数类)

    D. Valid Sets time limit per test 1 second memory limit per test 256 megabytes input standard input ...

随机推荐

  1. webdriervAPI(XPath元素定位)

    from  selenium  import  webdriver driver  =  webdriver.Chorme() driver.get("http://www.baidu.co ...

  2. C学习笔记-结构体

    结构体的定义和初始化 结构体是简单数据类型的综合 struct man { char name[100]; int age; }; struct man m = { "tom", ...

  3. flask_script

    Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任 ...

  4. 【转贴】优秀的龙芯Docker虚拟机解决方案

    优秀的龙芯Docker虚拟机解决方案 http://www.loongson.cn/m/view.php?aid=836 时间:2019-05-23 15:03  来源:未知   作者:龙芯中科    ...

  5. Roadmap-学习目标

    自学过一些HTML标签,学的不多也没经常用,但还是比较喜欢前端,希望可以深入学习有用的东西,最后弄一个自己看的过去的博客练练.手.

  6. 双元素非递增(容斥)--Number Of Permutations Educational Codeforces Round 71 (Rated for Div. 2)

    题意:https://codeforc.es/contest/1207/problem/D n个元素,每个元素有a.b两个属性,问你n个元素的a序列和b序列有多少种排序方法使他们不同时非递减(不同时g ...

  7. c++学习笔记之类和对象(三、static静态成员变量和静态成员函数)

    一.static静态成员变量 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.是有时候我们希望在多个对象之间共享数据,对象 a 改变 ...

  8. python并发编程-进程理论-进程方法-守护进程-互斥锁-01

    操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) ...

  9. python网络爬虫(4)结构与基本概念

    基本模型 请求与响应 import urllib.request as urllib2 request=urllib2.Request('http://www.zhihu.com') response ...

  10. mongo分布式锁Java实现

    一.分布式锁使用场景: 代码部署在多台服务器上,即分布式部署. 多个进程同步访问一个共享资源. 二.需要的技术: 数据库:mongo java:mongo操作插件类 MongoTemplate(mav ...