分析:一道非常恶心的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模拟赛 党的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. Dice (HDU 4652)

    题面: m 面骰子,求1. 出现n个连续相同的停止 ;2. 出现n个连续不同的停止的期望次数.(n, m ≤ 10^6 ) 解析: 当然要先列式子啦. 用f[i](g[i])表示出现i个连续相同(不相 ...

  2. 72. js EXTJS grid renderer用法

    转自:https://blog.csdn.net/shancunxiaoyazhi/article/details/22156083 renderer : Function (可选的)该函数用于加工单 ...

  3. 7.2 高速缓冲存储器-Cache

    高速缓冲存储器:Cache.Cache的功能是提高CPU数据的输入和输出的速率.CPU的速度与主存的速度之间有巨大的差异.主存的存取时间.存取速度要比CPU的速度要慢了很多倍.为了调和它们之间的巨大速 ...

  4. LVS上DR和NAT模式的缺陷

    引言 相信一般的小公司用的最多的还是DR和NAT模式,关于DR和NAT模式的原理请看看下图,我们先从lvs的DR和NAT模式特性聊聊一些问题. 问题1.lvs的DR模式和NAT模式核心缺陷有哪些? D ...

  5. 9.10NOIP模拟题

      9.10 NOIP模拟赛 题目名称 区间 种类 风见幽香 题目类型 传统 传统 传统 可执行文件名 section kinds yuuka 输入文件名 section.in kinds.in yu ...

  6. BigInteger、BigDecimal类的使用详解

    我们都知道在java里边long算是存储长度比较大的了,但是如果有很大的数我们应该怎么处理呢,不用怕,java还为我们准备了一个BigInteger的类,那么这个类到底能存储多大的数呢,这个一时还真不 ...

  7. datatable 的使用方法

    遍历datatable的方法 +方法一:DataTable dt = dataSet.Tables[0];for(int i = 0 ; i < dt.Rows.Count ; i++){str ...

  8. phonegap在eclipse上的安装

    1.首先安装好eclipse 2.下载安装好sdk 3.下载安装好adt 4.在这个地方下载好phonegap的包,https://codeload.github.com/phonegap/phone ...

  9. [转]linux之磁盘配额(quota)

    转自:http://www.jb51.net/LINUXjishu/78446.html 磁盘配额(quota)比较常用的几个情况是: * 针对WWW server,例如:每个人的网页空间的容量限制 ...

  10. 关于MVC视图下拉菜单绑定与取值的问题

    绑定视图中dropdownlist: 视图中的代码: @Html.DropDownList("select1") 此处的slect1也就是页面上的<select>< ...