noip模拟赛 党


分析:一道非常恶心的dp题.每个人要么选或不选,很像是0-1背包,可以套用背包问题的状态,但是因为题目要求3个值,所以可以再加一维表示3个答案.
f[i][j][k][l][p][0/1/2]表示i个守门员,j个后卫,k个中锋,l个前锋,花费是p,最后一维是0则表示不考虑队长的价值,1是方案数,2是队长价值.在这个状态表示里省去了一维表示前多少个人,其实就是一个滚动数组,递推的时候要倒序枚举.因为队长的价值会被算两边,所以队长肯定是价值最大的,先对所有人排个序,枚举到第i个人的时候,就让第i个人当队长就行了,不需要再去枚举.然后根据题目说的那样更新0/1/2就可以了.
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> using namespace std; const int mod = , inf = 0x7fffffff; int n, up[], down[], f[][][][][][], ans0, ans1 = inf, ans2;
int maxn; struct node
{
int id, v, c;
}e[]; bool cmp(node a, node b)
{
return a.v < b.v;
} void init()
{
up[] = ;
down[] = ;
up[] = ;
down[] = ;
up[] = ;
down[] = ;
up[] = ;
down[] = ;
} void update(int i, int j, int k, int l,int p,int fangan, int jiazhi, int duizhang)
{
if (f[i][j][k][l][p][] < jiazhi)
{
f[i][j][k][l][p][] = jiazhi;
f[i][j][k][l][p][] = ;
f[i][j][k][l][p][] = duizhang;
}
if (f[i][j][k][l][p][] == jiazhi && f[i][j][k][l][p][] < duizhang)
{
f[i][j][k][l][p][] = ;
f[i][j][k][l][p][] = duizhang;
}
if (f[i][j][k][l][p][] == jiazhi && f[i][j][k][l][p][] == duizhang)
{
f[i][j][k][l][p][] += fangan;
if (f[i][j][k][l][p][] >= mod)
f[i][j][k][l][p][] = mod;
}
} void gengxin(int x)
{
for (int i = up[] - (e[x].id == ); i >= ; i--)
for (int j = up[] - (e[x].id == ); j >= ; j--)
for (int k = up[] - (e[x].id == ); k >= ; k--)
for (int l = up[] - (e[x].id == ); l >= ; l--)
if (i + j + k + l < )
{
for (int p = maxn - e[x].c; p >= ; p--)
if (f[i][j][k][l][p][])
update(i + (e[x].id == ), j + (e[x].id == ), k + (e[x].id == ), l + (e[x].id == ), p + e[x].c,f[i][j][k][l][p][], f[i][j][k][l][p][] + e[x].v, e[x].v);
}
} int main()
{
init();
f[][][][][][] = -;
f[][][][][][] = ;
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
char s[];
scanf("%s", s + );
scanf("%d%d", &e[i].v, &e[i].c);
if (s[] == 'G')
e[i].id = ;
if (s[] == 'D')
e[i].id = ;
if (s[] == 'M')
e[i].id = ;
if (s[] == 'F')
e[i].id = ;
}
scanf("%d", &maxn);
sort(e + , e + + n,cmp);
for (int i = ; i <= n; i++)
gengxin(i);
for (int i = down[]; i <= up[]; i++)
for (int j = down[]; j <= up[]; j++)
for (int k = down[]; k <= up[]; k++)
for (int l = down[]; l <= up[]; l++)
if (i + j + k + l == )
for (int p = ; p <= maxn; p++)
if (f[i][j][k][l][p][])
{
int temp0 = f[i][j][k][l][p][] + f[i][j][k][l][p][];
int temp1 = p;
int temp2 = f[i][j][k][l][p][];
if (temp0 > ans0)
{
ans2 = ;
ans0 = temp0;
ans1 = temp1;
}
if (temp0 == ans0 && temp1 < ans1)
{
ans1 = temp1;
ans2 = ;
}
if (temp0 == ans0 && temp1 == ans1)
{
ans2 += temp2;
if (ans2 >= mod)
ans2 = mod;
}
}
printf("%d %d %d\n", ans0, ans1, ans2); return ;
}
noip模拟赛 党的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- [ZJOI 2009] 假期的宿舍
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1433 [算法] 二分图匹配[代码] #include<bits/stdc++. ...
- SQL Server 数据字典生成脚本
SELECT sysobjects.name AS 表名称 ,--sysproperties.[value] AS 表说明 ,syscolumns.name AS 字段名称 ,--properties ...
- RocketMQ(2)
1. 消费端集群消费(负载均衡) 示例代码: /** * Producer,发送消息 * */ public class Producer { public static void main(Stri ...
- php三方网站使用微信公众号推送文章
//获取accesstoken 的方法public function index(){ $appId = 'wxd0e50fe967dccccc'; $appSecret = 'd7f6be12ce4 ...
- linux 防火墙关闭
systemctl status firewalld.servicesystemctl status iptables.service关闭防火墙,selinux15:54:43运维-李浩 2017/ ...
- 【LeetCode】105 & 106 Construct Binary Tree from (Preorder and Inorder) || (Inorder and Postorder)Traversal
Description: Given arrays recording 'Preorder and Inorder' Traversal (Problem 105) or 'Inorder and ...
- 软件架构自学笔记-- 转载“虎牙在全球 DNS 秒级生效上的实践”
虎牙在全球 DNS 秒级生效上的实践 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下 5 各部分: 背景介绍: 方案设计和对比: 高可用: 具体实践和落地: ...
- 使用adb命令提示端口被占用
图是我的65535端口被占用了,一般adb默认使用的是5037端口##方式一 5037为adb默认端口,若5037端口被占用,查看占用端口的进程(使用命令netstat -aon|findstr ...
- cms中某些标题链接的单独写法
href="{$CATEGORYS[45][url]}" 链接写法, {$CATEGORYS[45][catname]} 标题写法 在show页面中 src="{$thu ...
- JS高级——面向对象方式解决歌曲管理问题
需要注意的问题: 1.其他模块若是使用构造函数MP3创建对象,唯一不同的就是他们传入的音乐库是不一样的,所以构造函数中存在一个songList属性,其他一样的就被添加到了构造函数的原型对象之中 2.原 ...