http://poj.org/problem?id=1065
题意比较简单,有n跟木棍,事先知道每根木棍的长度和宽度,这些木棍需要送去加工,第一根木棍需要一分钟的生产时间,如果当前木棍的长度跟宽度
都大于前一根木棍,那么这根木棍不需要生产时间,问你最少的生产时间是多少?
首先可以贪心,先按长度 l排序,如果l相同,按宽度w排序。
从i=0开始,每次把接下来的i+1 - n-1 的没有标记并且长度和宽度大于等于i这根木棍的长度和宽度标记起来。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn = 5010; 7 8 struct point 9 { 10 int l,w; 11 bool operator < (const point &a) const 12 { 13 return l==a.l ? w<a.w : l<a.l; 14 } 15 }p[maxn]; 16 17 int mark[maxn]; 18 19 int main() 20 { 21 int t,n; 22 scanf("%d",&t); 23 while(t--) 24 { 25 scanf("%d",&n); 26 for(int i=0;i<n;i++) 27 { 28 scanf("%d%d",&p[i].l,&p[i].w); 29 } 30 sort(p,p+n); 31 //for(int i=0;i<n;i++) printf("%d %d ",p[i].l,p[i].w); 32 int s=0; 33 memset(mark,0,sizeof(mark)); 34 for(int i=0;i<n;i++) 35 { 36 int temp=p[i].w; 37 if(!mark[i]) 38 { 39 for(int j=i+1;j<n;j++) 40 { 41 if(p[j].w>=temp&&!mark[j]) 42 { 43 temp=p[j].w; 44 mark[j]=1; 45 } 46 } 47 s++; 48 } 49 } 50 printf("%d ",s); 51 } 52 return 0; 53 }
dp:排序跟上面一样,然后就是找 w 的最长下降子序列。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn = 5010; 7 8 struct point 9 { 10 int l,w; 11 bool operator < (const point &a) const 12 { 13 return l==a.l ? w<a.w : l<a.l; 14 } 15 }p[maxn]; 16 17 int dp[maxn]; 18 19 int main() 20 { 21 int t,n; 22 scanf("%d",&t); 23 while(t--) 24 { 25 scanf("%d",&n); 26 for(int i=0;i<n;i++) 27 { 28 scanf("%d%d",&p[i].l,&p[i].w); 29 } 30 sort(p,p+n); 31 //for(int i=0;i<n;i++) printf("%d %d ",p[i].l,p[i].w); 32 int ans=0; 33 for(int i=0;i<n;i++) dp[i]=1; 34 for(int i=0;i<n;i++) 35 { 36 for(int j=0;j<i;j++) 37 if(p[j].w>p[i].w) dp[i]=max(dp[i],dp[j]+1); 38 ans=max(ans,dp[i]); 39 } 40 printf("%d ",ans); 41 } 42 return 0; 43 }