NYOJ 236 心急的C小加

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=236

思路:还是属于贪心系列,按照长度排序,如果长度相同则按重量排序。总是找长度和重量都大于等于前一个木棒,就能计算出最短时间。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 struct mb
 6 {
 7     int len; //
 8     int weight;//重量
 9 }w[10001];  //定义一个结构体数组 
10 bool cmp(mb x,mb y) //按照长度排序,如果长度相同则按重量排序
11 {
12     if(x.len<y.len)  return true;  //升序
13     if(x.len==y.len&&x.weight<y.weight)  return true;
14     return false;
15 }
16 int main()
17 {
18     int s,n,i,j,count,t;
19     scanf("%d",&s);
20     while(s--)
21     {
22         memset(w,0,sizeof(w)); //首先需要将数组清零
23         count=0;
24         scanf("%d",&n);
25         for(i=0;i<=n-1;i++)
26         {
27             scanf("%d%d",&w[i].len,&w[i].weight);
28         }
29         sort(w,w+n,cmp);
30         for(i=0;i<=n-1;i++)//此时长度,重量已经从小到大排好了 
31         {
32             if(w[i].weight!=0) //如果这个数没有出现过,后面代码有标记
33             {
34                 t=w[i].weight;
35                 count++;  //开启就需要耗一个单位
36                 for(j=i+1;j<=n-1;j++)
37                 {
38                     if(w[j].weight>=t)
39                     {
40                         t=w[j].weight;//即4 5 9, 1 2 用一个数保存最新清零的重量,在j循环中保证了一次能够处理的木棒最多
41                         w[j].weight=0;//将排序好的标记为0,清除,即5 9 被清零后下次就直接比较1 2, 
42                     }
43                 }
44              }
45          }
46          printf("%d\n",count);
47     } 
48     return 0;
49 }
    

 

 

posted on 2012-08-15 10:29  mycapple  阅读(580)  评论(0编辑  收藏  举报

导航