Acwing-277-饼干(DP)
链接:
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)的更多相关文章
- Acwing P277 饼干 题解
每日一题 day20 打卡 Analysis 线型动态规划 读入每个人的贪婪度之后,对其按照从大到小的顺序排序,定义状态f[i][j]为前i个人(排序后)分j个饼干的答案,那么答案为f[n][m],考 ...
- csp-s 考前刷题记录
洛谷 P2615 神奇的幻方 洛谷 P2678 跳石头 洛谷 P1226 [模板]快速幂||取余运算 洛谷 P2661 信息传递 LOJ P10147 石子合并 LOJ P10148 能量项链 LOJ ...
- AcWing 313. 花店橱窗 (线性DP)打卡
题目:https://www.acwing.com/problem/content/315/ 题意:有一个矩阵,你需要在每一行选择一个数,必须保证前一行的数的下标选择在下一行的左边,即下标有单调性,然 ...
- AcWing 312. 乌龟棋 (简单DP)打卡
题目:https://www.acwing.com/problem/content/description/314/ 题意:有一段路,每个格子都有个价值,然后有m张卡牌,四种类型,走1,2,3,4步, ...
- AcWing 233. 换教室 (期望DP+floyd)打卡
题目:https://www.acwing.com/problem/content/235/ 题意:有n个时间段,这个时间段有两个地方授课ci,di,最开始是在ci,可以申请去di,但是是几率的,然后 ...
- AcWing 232. 守卫者的挑战 (期望DP)打卡
题目:https://www.acwing.com/problem/content/description/234/ 题意:有n次挑战,每次挑战获胜可以得到一个地图碎片值为-1 或者 可以得到一个 ...
- 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 ...
- codeforces 277.5 div2 F:组合计数类dp
题目大意: 求一个 n*n的 (0,1)矩阵,每行每列都只有两个1 的方案数 且该矩阵的前m行已知 分析: 这个题跟牡丹江区域赛的D题有些类似,都是有关矩阵的行列的覆盖问题 牡丹江D是求概率,这个题是 ...
- 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 ...
- 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 ...
随机推荐
- Ubuntu强制修改root密码
Ubuntu忘记超级用户root密码并重新设置密码 解决方法如下: 第一种方法——不进入recovery mode设置(推荐) 说明案例:Ubuntu版本:Ubuntu 16.04.3 LTS Ste ...
- SQLServer2008R2复制发布订阅(含局域网跨网段)调试总结
需要注意的问题点: 一.发布服务器A和订阅服务器B都在同一个网段的局域网内 1.两台服务器的SQLServer版本必须一致. 2.两服务器之间访问没难度,直接就可以搜索到. 3.注意请求订阅和推送订阅 ...
- Linux 中账户管理
账户管理涉及到三个文件: 1./etc/passwd yy@ubuntu:~$ head -n 3 /etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x ...
- 再谈循环&迭代&回溯&递归&递推这些基本概念
循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...
- limit和offset、切片操作
#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,\ Da ...
- ioctl接口内容操作
int ioctl( int fd, int request, .../* void *arg */ ) 详解 第三个参数总是一个指针,但指针的类型依赖于request 参数.我们可以把和网络相关的请 ...
- C++;STL--队列与栈;
队列 queue模板类的定义在<queue>头文件中. queue 模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型. 定 ...
- P3376 网络流-最大流模板题(Dinic+当前弧优化)
(点击此处查看原题) Dinic算法 Dinic算法相对于EK算法,主要区别在于Dinic算法对图实现了分层,使得我们可以用一次bfs,一次dfs使得多条增广路得到增广 普通的Dinic算法已经可以处 ...
- python-day9(正式学习)
目录 深浅拷贝 拷贝 浅拷贝 深拷贝 异常处理 什么是异常 语法错误 逻辑错误 异常的种类 常用的异常 其他异常 异常处理 提前预防 事后预防 抛出异常(基本没用) 断言(调试用,现在基本上没用) 文 ...
- CVE-2017-17558漏洞学习
简介 这是USB core中的一个拒绝服务漏洞.带有精心设计的描述符的恶意USB设备可以通过在配置描述符中设置过高的bNumInterfaces值来导致内核访问未分配的内存.虽然在解析期间调整了该值, ...