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 ...
随机推荐
- fprintf与stderr、stdout的使用
#include <stdio.h> void main() { fprintf(stderr,"soyo8888!"); fprintf(stdout,"s ...
- 63.ExtJs事件(自定义事件、on、eventManager)示例
转自:https://blog.csdn.net/leadergg/article/details/5927614?utm_source=blogxgwz5 ExtJs事件(自定义事件.on.even ...
- Oracle数据库初学者入门教程
Oracle数据库是相对于其他数据库来说比较难的一个.Oracle Database,又名Oracle RDBMS,简称Oracle.是甲骨文公司推出的一款关系数据库管理系统.Oracle数据库系统是 ...
- BigInteger、BigDecimal类的使用详解
我们都知道在java里边long算是存储长度比较大的了,但是如果有很大的数我们应该怎么处理呢,不用怕,java还为我们准备了一个BigInteger的类,那么这个类到底能存储多大的数呢,这个一时还真不 ...
- python网络爬虫之图片链家在技术.seleninum和PhantonJS
一.什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- impo ...
- Linux egrep命令
Linux egrep命令用于在文件内查找指定的字符串. egrep执行效果与"grep-E"相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法. e ...
- 3 工欲善其事必先利其器,C#开发环境准备
1. 为什么选择C#作为入门的编程语言开始学习? Java和C#是比较主流的两大开发语言.(除了这两种还有什么比较流行的开发语言?)相对于Java,C#的入门要容易一些.学习java开发需 ...
- Linq学习(零)-错误汇总
问题一: Cannot execute text selection: CS0009 Metadata file 'C:\Users\Kimisme\Documents\LINQPad Plugins ...
- 11.Layers, Containers and Interfaces
图层.容器和接口 当设计一个Ventuz场景时,某些节点的组合或设计会反复出现.例如在演示中使用的按钮或滑块,在整个过程中的呈现和外观都是一致的,唯一变化的是尺寸.位置和标签. 在设计复杂的演示时,另 ...
- ios9-NSLayoutAnchor和UILayoutGuide实现自动布局
@interface ViewController () { NSLayoutConstraint *yellowViewTopConstraint; NSLayoutConstraint *blue ...