题目大意:


       给定一个区间范围[M,E],接下来有n行输入。每行输入三个数值:T1,T2,S,表示覆盖区间[T1,T2]


的代价为S,要求你求出覆盖区间[M,E]的最小代价,假设不能覆盖,则输出-1.


解题思路:

 

    先将区间按右端点进行排序,这样我们就能得到dp状态的定义和转移方程:

       dp[i]:表示覆盖[M,cow[i].T2]的最小覆盖代价.

       dp[i] = cow[i].cost (cow[i].l == M) 或者 dp[i] = min(dp[j~i]) + cow[i].cost(cow[j].T2 >= cow[i].T1-1)


因为右端点可能有重合的情况,所以我们的dp[i]中可能存放的并非最小覆盖代价。当然了,


我们能够对右端点进行离散化。然后去重,这样dp数组里面存放的就是最优解,只是这添加了


编程的复杂度,代码量也加大不少.事实上,我们依旧能够用上述dp定义。最后dp[j~i]cow[j].T2==cow[i].T2)


的最小值就能够了.关于dp[i] = min(dp[j~i]) + cow[i].cost,是个RMQ问题,这里我用的是线段树实现的.


以下是解题代码。代码中对空间进行了优化。所以代码中并没有dp数组。其值都存放在线段树中.

#include<stdio.h>
#include<algorithm>
#define MAX_N 11000
#define INF 100000000000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
struct Node
{
int l,r,c;
bool operator < (const Node &tmp) const
{
return r < tmp.r;
}
}cow[MAX_N];
long long tree[MAX_N<<2];
void build(int l,int r,int rt)
{
tree[rt] = INF ;
if( l == r)
return;
int m = l + ( r - l ) / 2 ;
build(lson);
build(rson);
}
long long query(int L,int R,int l,int r,int rt)
{
if(L <= l && r <= R)
return tree[rt];
int m = l + ( r - l ) / 2 ;
long long tmp = INF;
if(L <= m)
tmp = query(L,R,lson);
if(R > m)
tmp = min(tmp,query(L,R,rson));
return tmp;
}
void update(int pos,long long val,int l,int r,int rt)
{
if(l == r)
{
tree[rt] = val ;
return;
}
int m = l + ( r - l ) / 2 ;
if(pos <= m)
update(pos,val,lson);
else
update(pos,val,rson);
tree[rt] = min(tree[rt<<1],tree[rt<<1|1]);
}
//去掉不满足条件的区间
int init(int n)
{
int cnt = 0 , r_max = cow[0].r ;
for(int i=1;i<n;++i)
{
if(cow[i].r != cow[i-1].r)
r_max = cow[cnt].r ;
if(cow[i].l - 1 <= r_max)
cow[++cnt] = cow[i];
}
return cnt;
}
int Bin(int key,int l,int r)
{
while(l <= r)
{
int m = l + ( r - l ) / 2 ;
if(cow[m].r < key)
l = m + 1 ;
else
r = m - 1 ;
}
return l;
}
int main()
{
int n,m,e;
while(~scanf("%d%d%d",&n,&m,&e))
{
int l_min = 90000 , r_max = 0 ;
for(int i=0;i<n;++i)
{
scanf("%d%d%d",&cow[i].l,&cow[i].r,&cow[i].c);
l_min = min(l_min,cow[i].l);
r_max = max(r_max,cow[i].r);
}
sort(cow,cow+n);
n = init(n) ;
if(l_min > m || r_max < e || cow[n].r < e)
{
printf("-1\n");
continue;
}
build(0,n,1);
for(int i=0;i<=n;++i)
{
long long tmp;
if(cow[i].l == m)
tmp = (long long)cow[i].c ;
else
tmp = query(Bin(cow[i].l-1,0,i),i,0,n,1) + cow[i].c;
update(i,tmp,0,n,1);
}
printf("%I64d\n",query(Bin(cow[n].r,0,n),n,0,n,1));
}
return 0;
}

POJ 3171的更多相关文章

  1. POJ 3171 Cleaning Shifts(DP+zkw线段树)

    [题目链接] http://poj.org/problem?id=3171 [题目大意] 给出一些区间和他们的价值,求覆盖一整条线段的最小代价 [题解] 我们发现对区间右端点排序后有dp[r]=min ...

  2. poj 3171 Cleaning Shifts(区间的最小覆盖价值)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2743   Accepted: 955 De ...

  3. POJ 3171 Cleaning Shifts

    Description Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. Th ...

  4. POJ 3171 DP

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3563   Accepted: 1205 D ...

  5. POJ 3171.Cleaning Shifts-区间覆盖最小花费-dp+线段树优化(单点更新、区间查询最值)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4721   Accepted: 1593 D ...

  6. POJ 3171 区间最小花费覆盖 (DP+线段树

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4245   Accepted: 1429 D ...

  7. POJ 3171 区间覆盖最小值&&线段树优化dp

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4715   Accepted: 1590 D ...

  8. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  9. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

随机推荐

  1. 74HC164dD驱动LED

    驱动要点: 1.上升沿写入串行数据: CLK=0; DAT=num&0x01; CLK=1; 2.写入数据的数码管编码(指代码中的 tab[]) 串行数据是FIFO先进先出,也就是先写高位,移 ...

  2. STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

    Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信. ...

  3. asp.net 正在加载/处理(兼容IE Chrome)

    正在加载分两种 一种是页面初始化效果,也就是数据读取前,这个时候需要用ajax先显示读取中数据,当ajax回调的时候,读取页面数据 一种是界面读取中效果,就是用div显示,当OnPreRenderCo ...

  4. iOS开发小技巧--键盘处理以及解决block造成循环引用的小技巧

  5. Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function问题解决

    selenium 目录下的lib文件夹下的所有包都加到类库里

  6. JavaBeans 官方文档学习

    提示,重点:JavaBeans的Property和 Events:PropertyEditor极其注册和查找机制. 从目前来看,JavaBeans 更像是源自GUI的需求. 使用NetBeans新建一 ...

  7. thinkphp中ajaxReturn的用法

    1.例子: if ($codeid = $model->addCustomer($this->admin["id"])) { $data["code" ...

  8. Mac 文件读写权限问题 OSError: Operation not permitted

    Mac在OS X 10.11以后加入了Rootless功能,主要是限制了root权限,阻止用户对部分路径下的目录进行更改.受到限制的有以下目录: /System /bin /sbin /usr (ex ...

  9. hdu 3599(最短路+最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3599 思路:首先spfa求一下最短路,然后对于满足最短路上的边(dist[v]==dist[u]+w) ...

  10. 使用JSP表达式和JSP脚本打印九九乘法表

    首先使用JSP声明声明一个函数用于得到九九乘法表的内容 <%! String printMultiTable() { String s = ""; for (int i = ...