传送门

Description

奶牛想证明它们是聪明而风趣的。为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行了面试,确定了每头奶牛的智商和情商。

贝西有权选择让哪些奶牛参加展览。由于负的智商或情商会造成负面效果,所以贝西不希望出展奶牛的智商之和小于零,或情商之和小于零。

满足这两个条件下,她希望出展奶牛的智商与情商之和越大越好,请帮助贝西求出这个最大值。

Input

  • 第一行:单个整数N,
  • 第二行到第N + 1 行:第i + 1 行有两个整数:Si 和Fi,表示第i 头奶牛的智商和情商。

Output

  单个整数:表示情商与智商和的最大值。贝西可以不让任何奶牛参加展览,如果这样做是最好的,输出0

Sample Input

-
-
- - -

Sample Output


Hint

选择第一头,第三头,第四头奶牛,智商和为−5+6+2 = 3,情商和为7−3+1 = 5。再加

入第二号奶牛可使总和提升到10,不过由于情商和变成负的了,所以是不允许的

1 ≤ N ≤ 400;−1000 ≤ Si; Fi ≤ 1000

Solution

  一眼看出这是个背包,然后…………然后呢???

  最初想法是些bool型背包,发现爆空间(8000000*8000000)直接GG,于是放弃,想到之前的栈做法写了一个栈,使用map判重,详见代码一。然后发现map的复杂度过高,并且占据的空间依然很大,于是GG。

  考虑状态压缩。

  由于数组的下标可以存储一定的信息,我们使用f[i]的值存储s=i时最大的f值,由于要求结果最大,s一定时f显然越大越好。于是满足无后效性。注意要对下标进行平移,使用maxup和maxdown记录当前更新的上限和下限,每次进行转移。

  剪枝:如果s和f都小于零,那么你们今日知罪又有何用?显然他们对答案不会有任何好的贡献,直接continue即可。

Code

#include<map>
#include<cstdio>
#include<algorithm>
#define maxn 10010
#define maxm 4000010 inline void qr(int &x) {
char ch=getchar();int f=;
while(ch>''||ch<'') {
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
x*=f;
return;
} inline int max(const int &a,const int &b) {if(a>b) return a;else return b;}
inline int min(const int &a,const int &b) {if(a<b) return a;else return b;}
inline int abs(const int &x) {if(x>) return x;else return -x;} inline void swap(int &a,int &b) {
int c=a;a=b;b=c;return;
} struct Frog {
int s,f;
Frog() {s=f=;}
Frog(int x,int y) {s=x;f=y;}
};
Frog frog[maxm];
int top=;
inline bool operator <(const Frog &a,const Frog &b) {
if(a.s^b.s) return a.s<b.s;
return a.f<b.f;
} bool ins[maxn][maxn];
Frog temp; int n,a,b; inline bool cmp(const Frog &a,const Frog &b) {
int sa=a.s+a.f,sb=b.s+b.f;
return sa<sb;
} int main() {
qr(n);
for(int i=;i<=n;++i) {
a=b=;qr(a);qr(b);
if(a<=&&b<=) continue;
int t=top;
for(int j=;j<=t;++j) {
int da=frog[j].s+a,db=frog[j].f+b;
temp=Frog(da,db);
if(ins[da+][db+]) continue;
ins[da+][db+]=true;
frog[++top]=temp;
}
}
std::sort(frog+,frog++top,cmp);
for(int i=top;i;--i) {
if(frog[i].s>=&&frog[i].f>=) {
printf("%d\n",frog[i].s+frog[i].f);return ;
}
}
putchar('');putchar('\n');
return ;
}

代码1 map 45分

#include<cstdio>
#include<cstring>
#define maxn 800005 inline void qr(int &x) {
char ch=getchar();int f=;
while(ch>''||ch<'') {
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
x*=f;
return;
} inline int max(const int &a,const int &b) {if(a>b) return a;else return b;}
inline int min(const int &a,const int &b) {if(a<b) return a;else return b;}
inline int abs(const int &x) {if(x>) return x;else return -x;} inline void swap(int &a,int &b) {
int c=a;a=b;b=c;return;
} int n,frog[maxn],a,b,ans,maxup=,maxdown=;
const int away=; int main() {
qr(n);
std::memset(frog,-0x3f,sizeof frog);frog[away]=;
for(int i=;i<=n;++i) {
a=b=;qr(a);qr(b);
if(a<=&&b<=) continue;
int dd=maxdown+a;
if(a>) {
for(int j=maxup+a;j>=dd;--j)
frog[j]=max(frog[j],frog[j-a]+b);
maxup+=a;
}
else {
for(int j=dd;j<=maxup;++j)
frog[j]=max(frog[j],frog[j-a]+b);
maxdown+=a;
}
}
for(int i=away;i<=maxup;++i)
{
if(frog[i]>=) ans=max(frog[i]+i-away,ans);
}
printf("%d\n",ans);
return ;
}

Summary

  1、使用map且结构体为第一关键字时,需要重载合法的小于号供map使用,如果需要规则不同的sort,需要手写比较函数,不能重载运算符。

   2、二维dp且空间较大的时候可以考虑状压,把其中一维作为下标处理。

   3、这题是怎么被评到绿题去的??我怎么做着和黑题一样

【DP】【P2340】奶牛会展的更多相关文章

  1. P2340 奶牛会展(状压dp)

    P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...

  2. P2340 奶牛会展 DP 背包

    P2340 奶牛会展 DP \(n\)头牛,每头牛有智商\(s[i]\)情商\(f[i]\),问如何从中选择几头牛使得智商情商之和最大 且 情商之和.智商之和非负 \(n\le 400,-10^3\l ...

  3. 洛谷P2340 奶牛会展

    题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成 ...

  4. 【题解】 洛谷P2340 奶牛会展

    传送门 重新开始打代码Day1 第一眼看感觉不对啊,这道题目好像空间开不下,是不是不能dp... 后来想到了一个思路,他要求的是\(dp_{i,j,k}=j+k\),然后这样子不是很奇怪吗? 直接一维 ...

  5. 【Luogu】P2340奶牛会展

    题目链接 突发奇想可以用f[i]表示智商和为i的时候情商最大是多少.这样就变成了一个背包问题. 最后更新答案的时候从0到最大背包容量遍历,最后答案是最大的i+f[i]; 但是虽然答案只能从0到m里选, ...

  6. 【洛谷P2340】 奶牛会展

    \(奶牛会展\) 题目链接 由于智商之和或情商之和不能为负数,所以直接把智商+情商>0的奶牛加上是布星的 我们考虑背包,不妨将智商当做物品大小,将情商当做价值 我们要求 大小+价值 的最大值 \ ...

  7. [USACO]奶牛会展(背包)

    [USACO]奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览. ...

  8. 【dp】奶牛家谱 Cow Pedigrees

    令人窒息的奶牛题 题目描述 农民约翰准备购买一群新奶牛. 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < ...

  9. 线性dp 之 奶牛渡河

    题目描述 Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏. 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木 ...

随机推荐

  1. springboot在application.yml中使用了context-path属性导致静态资源法加载,如不能引入vue.js,jquery.js,css等等

    在springBoot配置中加入上下文路径 server.context-path=/csdn js,img等静态文件无法加载,出现404的问题 <script type="text/ ...

  2. Windows如何设置动态和静态ip地址

    打开控制面板,一般在电脑的菜单栏能找到,win8和win10可以使用快捷键(win键+X键),找不到的朋友可以搜索一下.   进入到网络和共享中心,点击更改适配器设置.   这里显示的是电脑所以的网络 ...

  3. [CodeForce455A]Boredom

    题面描述 Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long ...

  4. JAVA基础学习之路(四)定义简单java类

    简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一 ...

  5. 腾讯地图和百度地图的PHP相互转换

    /** * 百度地图---->腾讯地图 * @param double $lat 纬度 * @param double $lng 经度 * @return array(); */ functio ...

  6. spark提交任务的两种的方法

    在学习Spark过程中,资料中介绍的提交Spark Job的方式主要有两种(我所知道的): 第一种: 通过命令行的方式提交Job,使用spark 自带的spark-submit工具提交,官网和大多数参 ...

  7. Open MPI集群运行

    部署完之后,代码也能正确跑起来了,也确实集群分散了.跑一下各种各样的代码,发现了一个错误: $ ~/OpenMpi/bin/mpiexec -np ~/NetWorkTest My rank is M ...

  8. java常见的异常类型

    Exception分为两类:非运行是异常和运行时异常. java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常.A:NullPointerExcepti ...

  9. C++基础和STL,Effective C++笔记

    这个作者总结的c++基础,特别好. 可以看看. http://blog.csdn.net/tham_/article/details/51169792

  10. 20172330 2017-2018-1 《Java程序设计》第四周学习总结

    20172330 2017-2018-1 <Java程序设计>第四周学习总结 教材学习内容总结 这一周的内容还是比较多的,而且很复杂,包含第四和第七章. 第四章向我们介绍了类结构的定义与概 ...