题解 P2340 【奶牛会展】

此题搜索可以过!!!

看到此题,第一想法,是01背包,然而,作为一个蒟蒻,我怎么会打正解呢?,于是就开始打dfs!

想要完成此题,普通的搜索肯定是过不了的(不然要dp干嘛),所以,我们要考虑

剪枝

比较容易的,我们可以轻松想出来剪枝:

(不吐槽名字我们还是好朋友。。。)

1.用数组guji[i]表示搜索到i时,不考虑智商,情商必须大于零的限制,之后能获得的最大智,情商之和。如果当前搜索到的智,情商之和加上guji[i]任然小于等于已经搜出来的ans,那么,当前的状态一定不是最优的(这属于最优性优化)

2.用数组jiuzi表示搜索到i时,不考虑其他限制,之后能获得的最大的智商。如果当前搜索到的智商加上jiuz[i]任然小于0,那么,当前状态一定不满足智商必须大于零的限制。

3.用数组jiuq[i]表示搜索到i时,不考虑其他限制,之后能获得的最大的情商。同2

然后。。。你就A了。。。测试速度25ms。。。(orz)

代码:

//#pragma GCC optimize()//手动Ox优化
#include<bits/stdc++.h>
using namespace std;
const int N=402;//记得多开1位,因为要访问n+1
int z[N],q[N];
int ans=0;
int n;
int guji[N],jiuz[N],jiuq[N];
inline void dfs(int now,int zh,int qh){
    if(zh+qh+guji[now]<=ans){
        return;
    }
    if(zh+jiuz[now]<0){
        return;
    }
    if(qh+jiuq[now]<0){
        return;
    }
    if(now==n+1){//如果搜索到底
        ans=zh+qh;//由于当前答案一定最优,直接赋值
        return;
    }
    dfs(now+1,zh+z[now],qh+q[now]);
    dfs(now+1,zh,qh);
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d%d",&z[i],&q[i]);
    }
    for(int i=n;i>=1;--i){
        guji[i]=guji[i+1];
        jiuz[i]=jiuz[i+1],jiuq[i]=jiuq[i+1];
        if(z[i]>0){//如果智商大于0
            jiuz[i]+=z[i];//智商可取最大值加上z[i]
        }
        if(q[i]>0){
            jiuq[i]+=q[i];//情商可取最大值加上q[i]
        }
        if(z[i]+q[i]>0){//如果和大于零
            guji[i]+=z[i]+q[i];//最大值加上z[i]+q[i]
        }
    }
    dfs(1,0,0);
    cout<<ans;
    return 0;
}
/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/

原文地址:https://www.cnblogs.com/ThinkofBlank/p/10146161.html

时间: 2024-11-08 20:32:56

题解 P2340 【奶牛会展】的相关文章

洛谷P2340 奶牛会展

洛谷P2340 奶牛会展用下标表示智商,值表示情商 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int N = 411 ; 6 int n,m ; 7 int a[N],b[N],f[800011] ; 8 9 inline int read() 10 { 11 int x = 0 , f = 1 ; 12 char ch =

【题解】luogu p2340 奶牛会展

总结:1.智商从哪开始循环没想到. 2.将智商的正负分开讨论.负智商要用顺序,保证不会使一头牛多用. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN = 800005; 4 int dp[MAXN], n, iq[405], eq[405], maxx = -2000000; 5 int main() 6 { 7 memset(dp, -0x3f, sizeof(dp)); 8 dp[400000] = 0;

【Luogu】P2340奶牛会展

题目链接 突发奇想可以用f[i]表示智商和为i的时候情商最大是多少.这样就变成了一个背包问题. 最后更新答案的时候从0到最大背包容量遍历,最后答案是最大的i+f[i]; 但是虽然答案只能从0到m里选,转移过程中是不能丢掉负数体积的.这是因为人家题目只说了要最后的智商和不能小于零,情商和不能小于零,没说中间不可以. 代码如下. #include<cstdio> #include<cctype> #include<cstring> #include<algorithm

[USACO]奶牛会展(背包)

[USACO]奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成负面效果,所以贝西不希望出展奶牛的智商之和小于零,或情商之和小于零.满足这两个条件下,她希望出展奶牛的智商与情商之和越大越好,请帮助贝西求出这个最大值. 输入输出格式 输入格式: ? 第一行:单个整数N,1 ≤ N ≤ 400 ? 第二行到第N + 1 行:第i + 1 行有

奶牛会展

题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成负面效果,所以贝西不希望出展奶牛的智商之和小于零,或情商之和小于零.满足这两个条件下,她希望出展奶牛的智商与情商之和越大越好,请帮助贝西求出这个最大值. 输入输出格式 输入格式: • 第一行:单个整数N,1 ≤ N ≤ 400 • 第二行到第N + 1 行:第i + 1 行有两个整数:Si 和Fi,

矩阵乘法专题2——bzoj 1706 [usaco2007 Nov] relays 奶牛接力跑 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24960651 [原题] 1706: [usaco2007 Nov]relays 奶牛接力跑 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 340  Solved: 162 [Submit][Status] Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力

【题解】黑白奶牛

题目描述 有N只奶牛从左往右排成一行,编号是1至N.这N只奶牛当中,有一些奶牛是黑色的,其余的是白色的. color[i]表示第i只奶牛的颜色,如果color[i]=0则表示第i头奶牛是黑色的,如果color[i]=1则表示第i头奶牛是白色的. 六一奶牛儿童节快到了,农场主Farmer John要从这N头奶牛当中,挑选尽可能多的奶牛去参加晚会. Farmer John挑选奶牛的原则是:挑选编号是连续的一段奶牛,这一段奶牛的颜色必须全部是白色的. Farmer John有一个魔法棒,每用一次魔法棒

【题解】幸运奶牛

题目描述 有N头奶牛从左往右排成一行,编号是1至N.如果某头奶牛的编号是2的倍数或者是3的倍数,那么这头奶牛就是幸运奶牛.这N头奶牛中,总共有多少头奶牛是幸运奶牛? 输入输出格式 输入格式 一行,一个整数N. 输出格式 一行,一个整数,表示幸运奶牛的数量. 输入输出样例 输入样例 10 输出样例 7 说明 数据规模 对于70%的数据,1≤N≤10000. 对于100%的数据,1≤N≤2000000000. 题解 小学奥数,直接上代码. #include <cstdio> int main()

【题解】款待奶牛

题目描述 Farmer John有n(1≤n≤2000)个美味的食物,他想卖掉它们来赚钱给奶牛.这些食物放在一些箱子里,它们有些有趣的特性: (1)这些食物被编号为1-n,每一天Farmer John可以从这排箱子的头部或者尾部取出食物去卖: (2)这些食物放得越久,年龄越大,价值越大,食物i有一个初始的价值v(i): (3)放了a天后,年龄为a,食物最终的价值为v(i)×a. 给定每一个食物的初始价值v(i),请求出FJ卖掉它们后可以获得的最大价值,第一天出售的食物年龄为1,此后每增加一天食物