description |
有N个木棍,长度和宽度已知。现在要一个接一个的拼接木棍。当然我们需要计算总共拼接的时间。有以下规则: 对于第一根处理的木棍,我们需要1分钟。 之后处理的木棍,如果说他的长度l和宽度w满足l0<=l并且w0<=w,那么我们不需要额外再花费时间去拼接。 比如,对于(9,4),(2,5),(1,2),(5,3),(4,1)这5根木棍,我们需要花费最少2分钟的时间:(4,1),(5,3),(9,4)和(1,2),(2,5)。 |
input |
输入有多组数据,每组数据第一行为一个整数n,(1<=n<=5000),然后第二行有2n个整数,分别为(l1,w1),(l2,w2)……每个数最大不超过10000 |
output |
输出一个数sum,为最小的花费时间 |
sample_input |
5 4 9 5 2 2 1 3 5 1 4 3 2 2 1 1 2 2 3 1 3 2 2 3 1 |
sample_output |
2 1 3 |
贪心,排序是必须的。后面的处理应该大家都会的~~
#include <iostream> #include<algorithm> #include<stdio.h> using namespace std; struct data { int s,e; }a[5005]; bool cmp(data a,data b) { if(a.s!=b.s) return a.s<b.s; else return a.e<b.e; } int main() { int n,b[5005]; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d%d",&a[i].s,&a[i].e); b[i]=1; } sort(a,a+n,cmp); int x; for(int i=0;i<n;i++) { x=0; for(int j=0;j<i;j++) { if(a[i].e<a[j].e&&b[j]+1>x) b[i]=b[j]+1; if(x<b[i]) x=b[i]; } } x=b[0]; for(int i=0;i<n;i++) if(x<b[i]) x=b[i]; cout<<x<<endl; } return 0; }