标签:
贪心真是软肋。。。
好好刷题。
不然明天要炸。。。
今天全部贪心吧。
嗯!
还是一个结构体的排序。(这个东西真的好用!)
将长度按从小到大排序
如果长度相等则重量小的在前面
选定第一个节点未初始节点
然后扫描一边数组
看那些节点可以被不需要加工时间
做好标记
然后在顺序扫描一边数组
找出第一个没有标记的节点
再进行一次同样的扫描
依次循环
看几次完成
即为加工的时间
所以这个排序真的是精华!
我只能说膝盖已烂。。。
//l和w的意思是反的,w是长度,l是重量。 #include<iostream> #include<algorithm> #include<stdio.h> using namespace std; struct wood { int w; int l; } A[5001]; bool cmp(wood a,wood b) { // if(a.w == b.w) // return a.l < b.l;//长度相同,重量小的在前面 // else // return a.w < b.w; return a.w==b.w?a.l < b.l:a.w < b.w; } int main() { int d[5001];//用来记录不同序列的起点 int t,n,ans,i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d%d",&A[i].w,&A[i].l); sort(A,A+n,cmp);//长度先按升序排,那么重量发生冲突的地方就要重新安排 ans = 1; d[0] = A[0].l;//先把第一个设为起点 for(i=1;i<n;i++) { for(j=0;j<ans;j++) { if(A[i].l >= d[j])//可以排在后面,更新 { d[j] = A[i].l; break; } } if(j==ans)//所有起点都不行,则重新从这里安排一个起点 { if(A[i].l < d[j-1]) { d[j] = A[i].l; ans ++; } } } printf("%d\n",ans); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/whereyousink/article/details/47101759