codevs 1214 线段覆盖 贪心 解题报告
2017-07-05 21:28
381 查看
题目描述
数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大。n<=1000
输入描述 Input Description
第一行一个整数n,表示有多少条线段。接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点bi(保证左端点<右端点)和价值ci。
输出描述 Output Description
输出能够获得的最大价值样例输入 Sample Input
31 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
思路
就是一个简单的贪心代码
#include<cstdio> #include<algorithm> #include<cstring> const int INF=2e9; using namespace std; struct node{int x,y;}; bool cmp(node a,node b) { return a.x<b.x; } int main() { node g[10002]; for (int i=0;i<=10002;i++) { g[i].x=INF; g[i].y=INF; } g[0].x=-INF;g[0].y=-INF; int n,t,f[10002]; scanf("%d",&n); memset(f,0,sizeof(f)); int tmp; for (int i=1;i<=n;i++) { scanf("%d%d",&g[i].x,&g[i].y); if (g[i].x>g[i].y) { tmp=g[i].x; g[i].x=g[i].y; g[i].y=tmp; } } sort(g,g+10001,cmp); for (int i=1;i<=n;i++) { for (int j=i-1;j>=0;j--) if (g[i].x>=g[j].y&&f[i]<=f[j]+1) f[i]=f[j]+1; } int maxn=0; for (int i=0;i<=n;i++) for (int i=1;i<=n;i++) if (maxn<f[i]) maxn=f[i]; printf("%d",maxn); return 0; }
相关文章推荐
- 线段覆盖_codevs1214_贪心
- codevs 1214 线段覆盖(贪心 or dp)
- 【贪心】【codevs】1214 线段覆盖
- 【基础练习】【贪心】codevs1214 线段覆盖题解
- codevs1214 线段覆盖(贪心)
- codevs1214 线段覆盖(贪心)
- 【基础练习】【贪心】codevs1214 线段覆盖题解
- 【贪心】【排序】【codevs 1214】线段覆盖
- codevs 1214 线段覆盖(贪心)
- codevs1214 线段覆盖(贪心,区间型)
- codevs 1124线段覆盖(贪心)
- Codevs 1214 线段覆盖
- 线段覆盖 CODEVS - 1214
- codevs1214 线段覆盖
- codevs 1214线段覆盖
- CODEVS 1214线段覆盖
- CODE[VS] 天梯 1214 线段覆盖
- CODE[VS]_1214 线段覆盖问题
- codevs1214 线段覆盖
- 洛谷1791/CODEVS1214线段覆盖