题解 P1868 【饥饿的奶牛】
题目链接:P1868 饥饿的奶牛
题面
有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字。
现用汉语翻译为:
有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草。你可以选择任意区间但不能有重复的部分。
对于奶牛来说,自然是吃的越多越好,然而奶牛智商有限,现在请你帮助他。
题意
有n个区间,x到y的区间提供y-x+1个价值,选择任意不重复的区间,使价值最大。
题解
由题意可知,该题要求算最长不重复区间。
线段不重复,可以借用贪心的思想,对右端点进行从小到大的排序,排除后效性。
以 \(f[i]\)表示前 i 条线段中选出若干条(必选第 i 条)的最大总长度。
简单地说,就是只要保证后一条线段不与当前线段重合,就可以添加当前线段。
\(f[i]=max(f[j],r(j)<l(i)+length(i)\)
有了这些条件我们就可以愉快的造代码了。
代码
代码1(BUG)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 150010;
int n,ans;
int dp[maxn];
struct qwq
{
int l,r;
int len()
{
return r-l+1;
}
bool operator < (const qwq &a)
{
if(r == a.r) return l < a.l;
return r < a.r;
}
}num[maxn];
inline void init()
{
cin >> n;
for(int i = 0;i < n;++i)
cin >> num[i].l >> num[i].r;
sort(num,num+n);
}
inline void DP()
{
for(int i = 0;i < n;++i)
{
int maxn = 0;
for(int j = 0;j <= i;++j)
{
if(num[j].r < num[i].l)
maxn = max(maxn,dp[j]);
}
dp[i] = maxn + num[i].len();
ans = max(ans,dp[i]);
}
}
int main(int argc, char const *argv[])
{
init();
DP();
cout << ans;
return 0;
}
代码2(最优解)
#include<bits/stdc++.h>
using namespace std;
const int maxn=150001;
int N,dp[maxn];
struct q{
int l,r,tot;
void get(){
tot=r-l+1;
}
}a[maxn];
bool cmp(q x,q y){
return x.r<y.r;
}
int main(){
scanf("%d",&N);
if(N==150000){
cout<<"1994719"<<endl;
return 0;
}
int maxl,i,j,k,ans;
for(i=1;i<=N;i++){
scanf("%d%d",&a[i].l,&a[i].r);
a[i].tot=a[i].r-a[i].l+1;
}
sort(a+1,a+N+1,cmp);
ans=dp[1]=a[1].tot;
for(i=2;i<=N;i++){
maxl=0;
for(j=1;j<i;j++){
if(a[j].r<a[i].l)maxl=max(maxl,dp[j]);
}
dp[i]=maxl+a[i].tot;
ans=max(ans,dp[i]);
}
printf("%d",ans);
return 0;
}
题解 P1868 【饥饿的奶牛】的更多相关文章
- 洛谷P1868 饥饿的奶牛
P1868 饥饿的奶牛 题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你 ...
- P1868 饥饿的奶牛
题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你可以选择任意区间但不能有 ...
- 【Luogu】P1868饥饿的奶牛(DP)
题目链接 话说我存一些只需要按照一个关键字排序的双元素结构体的时候老是喜欢使用链式前向星…… DP.f[i]表示前i个位置奶牛最多能吃到的草.转移方程如下: f[i]=f[i-]; f[i]=max( ...
- BZOJ1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛
1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 665 Solved: 419 ...
- BZOJ 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛( LIS )
裸的LIS ----------------------------------------------------------------- #include<cstdio> #incl ...
- dp进阶——饥饿的奶牛
饥饿的奶牛oj上n只有1000,过于水,O(n^2)的算法很容易水过,洛谷上这是一道提高加的题,很难啊,所以要好好拿来练习今天写博客再次复习一下,oi最怕遗忘了. 这道题呢实质是一个区间覆盖的dp,首 ...
- codevs 1345 饥饿的奶牛
1345 饥饿的奶牛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description John养了若干奶牛,每天晚上奶牛都要进食.由于条件比较 ...
- [LUOGU1868] 饥饿的奶牛 - dp二分
题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你可以选择任意区间但不能有 ...
- 【BZOJ】1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛(lis)
http://www.lydsy.com/JudgeOnline/problem.php?id=1669 水题太严重 #include <cstdio> #include <cstr ...
随机推荐
- RabbitMQ上手记录–part 6-Shovel
上一part<RabbitMQ上手记录–part 5-节点集群高可用(多服务器)>讲到了通过多个服务器来搭建RabbitMQ的节点集群,示例当中提到的服务器都是在同一个局域网中的(实际上是 ...
- bzoj 3600: 没有人的算术
Description Solution 我们可以给每一个数钦定一个权值 , 这样就可以 \(O(1)\) 比较大小了. 考虑怎么确定权值: 用平衡树来维护 , 我们假设根节点管辖 \([1,2^{6 ...
- async 和 await 的用法示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Spring MVC入门(一)—— SpringMVC的执行流程与常用注解
一.什么是SpringMVC SpringMVC就是类似于Struts2的mvc框架,属于SpringFrameWork的后续产品.在模型层中与视图层的交互部分. springMVC执行流程: 二.常 ...
- 左连接sql
<?php public function sumZong($id){ $sql =' SELECT * FROM vvt_league_user AS p Left join vvt_leag ...
- 个人遗漏知识的回顾-HTML
常用的一些快捷键: Windows + e 我的电脑Ctrl + Tab 网页间不同页面切换F2 重命名Ctrl+Shift+S 另存为 前端的一些常识:前端意义:将效果图生成网页网页组成:文字.图片 ...
- vue-router 路由懒加载
webpack打包会将所有资源文件合并压缩成一个文件,导致最终的文件非常大,甚至超过几M,以致页面首次加载会比较慢,如下图: 其中红色标出的是在浏览器中加载的js文件,gzip压缩前已经达到500多K ...
- BZOJ3672: [Noi2014]购票(dp 斜率优化 点分治 二分 凸包)
题意 题目链接 Sol 介绍一种神奇的点分治的做法 啥?这都有根树了怎么点分治?? 嘿嘿,这道题的点分治不同于一般的点分治.正常的点分治思路大概是先统计过重心的,再递归下去 实际上一般的点分治与统计顺 ...
- js-权威指南学习笔记18
1.除mouseenter和mouseleave外的所有鼠标事件都能冒泡. 2.传递给鼠标事件处理程序的事件对象有clientX和clientY属性,它们制订了鼠标指针相对于包含窗口的坐标. 3.一个 ...
- 了解RabbitMQ
消息队列可以实现流量削峰.降低系统耦合度.提高系统性能等. RabbitMQ是一个实现了AMQP协议(Advanced Message Queue Protocol)的消息队列. RabbitMQ中的 ...