sdut.acm活动选择问题

来源:互联网 发布:淘宝店怎么加入淘客 编辑:程序博客网 时间:2024/06/08 00:24


解析:

本题采用贪心策略。

用begin[] end[]分别表示活动的开始时刻和结束时刻。每一个事件的开始时刻一定小于结束时刻。即begin[i]  < end[i].

例如三个事件a.b.c(a < b < c),即有begin[a]  < end[a] <=begin[b] < end[b]<=begin[c] < end[c]。

具体讲:

1 。第一要选取的事件是最早结束的事件。

2。下一个要选取的事件,必须是上一个事件结束后开始事件中最早结束的事件。

#include <stdio.h>int main(){    int num;    while(scanf("%d",&num) != EOF)    {         int begin[1000],end[1000],sum = 0,i,j,temp1,temp2;         int timestar = 0;        for(i = 0;i < num;i++)        {            scanf("%d %d",&begin[i],&end[i]);        }        for(i = 0;i < num-1;i++)          for(j = 0;j < num-1-i;j++)          {              if(end[j] > end[j+1])              {                  temp1 = begin[j];                  begin[j] = begin[j+1];                  begin[j+1] = temp1;                  temp2 = end[j];                  end[j] = end[j+1];                  end[j+1] = temp2;              }          }/*            采用冒泡排列法将时间按照            时间结束的顺序从大到下排列          */          i = 0;          while(i < num)          {              if(begin[i] >= timestar)/*比较结束事件的时间与下                                        一个开始时间是否符合条件*/              {                  timestar = end[i];                  sum += 1;                  i++;              }else              {                  i++;              }          }          printf("%d\n",sum);    }}