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 }

    

 

 

你可能感兴趣的:(OJ)