3027 线段覆盖 2

题目描述 Description

数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大。

n<=1000

输入描述 Input Description

第一行一个整数n,表示有多少条线段。

接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点bi(保证左端点<右端点)和价值ci。

输出描述 Output Description

输出能够获得的最大价值

样例输入 Sample Input

3

1 2 1

2 3 2

1 3 4

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

数据范围

对于40%的数据,n≤10;

对于100%的数据,n≤1000;

0<=ai,bi<=1000000

0<=ci<=1000000

分析:序列dp,先按右端点排序,然后判断后面线段line[i]的左端点是不是>=前面线段line[j]的右端点,是就更新dp[i]=max(dp[i],dp[j]+line[i].c);

最后找出最大的dp[]就是答案。。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 struct node
 8 {
 9     int a,b,c;
10 } line[1005];
11 int cmp(node x,node y)
12 {
13     return x.b<y.b;
14 }
15 int main()
16 {
17     int n;
18     int dp[1005];
19     cin>>n;
20     for(int i=0; i<n; i++)
21     {
22         cin>>line[i].a>>line[i].b>>line[i].c;
23     }·
24     sort(line,line+n,cmp);
25 //    for(int i=0; i<n; i++)printf("%d %d %d\n",line[i].a,line[i].b,line[i].c);
26     for(int i=0; i<n; i++)
27     {
28         dp[i]=line[i].c;
29         for(int j=0; j<i; j++)
30         {
31             if(line[j].b<=line[i].a)
32                 dp[i]=max(dp[i], dp[j]+line[i].c);
33         }
34     }
35 //    for(int i=0; i<n; i++)printf("%d ",dp[i]);
36 //    printf("\n");
37     int maxs=0;
38     for(int i=0; i<n; i++)
39         maxs=max(maxs,dp[i]);
40     printf("%d\n",maxs);
41     return 0;
42 }
时间: 2024-11-12 21:14:47

3027 线段覆盖 2的相关文章

【codevs】【DP】3027线段覆盖2

题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大. n<=1000 输入描述 Input Description 第一行一个整数n,表示有多少条线段. 接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点bi(保证左端点<右端点)和价值ci. 输出描述 Output Description 输出能够获得

CodeVS 3027 线段覆盖2

题目大意: http://codevs.cn/problem/3027/ 源码: #include <iostream> using namespace std; struct { int x,y,val; }tmp[1050]; int dp[1050] = {0}; int main() { int n; cin >> n ; for(int i = 1; i <= n; i++) { cin >> tmp[i].x >> tmp[i].y >

cogs265.线段覆盖

265. 线段覆盖 ★★★☆   输入文件:xdfg.in   输出文件:xdfg.out   简单对比 时间限制:2 s   内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操作: 用一条长度为 T 的黑布盖住条状物的 [a, a+T] 这个区间 (0<=a, T<=L) . 把某条黑布拿走. 输入 L 和 n 次操作,要你输出每次操作之后: 条状物上有多少个黑区间. 条状物上黑区间的总长度. [输入格式] 输入文件第一行两个整数L(1<=L<=2000

codevs 1643 线段覆盖 3

1643 线段覆盖 3 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少. 输入描述 Input Description 输入格式 输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段. 输出描述 Output Description 输出格式 输出文件仅包括1个整数,为k的最大值 样例输入 

COGS 265线段覆盖[线段树]

265. 线段覆盖 ★★☆   输入文件:xdfg.in   输出文件:xdfg.out   简单对比时间限制:2 s   内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操作: 用一条长度为 T 的黑布盖住条状物的 [a, a+T] 这个区间 (0<=a, T<=L) . 把某条黑布拿走. 输入 L 和 n 次操作,要你输出每次操作之后: 条状物上有多少个黑区间. 条状物上黑区间的总长度. [输入格式] 输入文件第一行两个整数L(1<=L<=200000

CODEVS1643 线段覆盖3[贪心]

1643 线段覆盖 3  时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少. 输入描述 Input Description 输入格式 输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段. 输出描述 Output Description 输出格式 输出文件仅包括1个整数,为k的最大值 样例输入

AGC017C Snuke and Spells(巧妙的线段覆盖模型)

题目大意: 给出n个球,每个球上都有数字,然后每次都进行如下操作 如果当前的球总共有k个,那么就把球上数字为k的所有球都消除掉 注意到,并不是每种情况都可以全部消光,所以你可以选择若干球,把它们标号改变,最后达到消光的目的 问最少需要改变几个球. 后面还跟着m个询问,每个询问会改变一个球的标号,问改变之后最少需要改变几个球才能消光. 题解: 大体先构建一个线段覆盖的模型,然后再证明这个模型是正确的 对于标号为i的球,覆盖线段[i-Ni, i](Ni为标号为i的球的个数) 每个球都做这样的覆盖,最

codevs 1214 线段覆盖

1214 线段覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数.有些线段之间会相互交叠或覆盖.请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点.所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分). 输入描

CODEVS3037 线段覆盖 5[序列DP 二分]

3037 线段覆盖 5  时间限制: 3 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~10^18,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大. 输入描述 Input Description 第一行一个整数n,表示有多少条线段. 接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点b