贪心——活动选择

问题 E: 【例6.5】活动选择

时间限制: 1 Sec   内存限制: 128 MB

题目描述

学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使用。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。

现在给出n个活动使用礼堂的起始时间beginibegini 和结束时间endi(begini<endi)endi(begini<endi) ,请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。

输入

第一行一个整数n(n≤1000);

接下来的n行,每行两个整数,第一个beginibegini ,第二个是endi(begini<endi≤32767)endi(begini<endi≤32767) 。

输出

输出最多能安排的活动个数。

样例输入

11
3   5
1  4
12  14
8  12
0  6
8  11
6  10
5  7
3  8
5  9
2  13

样例输出

4

提示

#include<iostream>
using namespace std;
struct activity
{
int begin;
int end;
}a[1000];
int main()
{
  int n;
  cin>>n;
 for(int i=0;i<n;i++)
 {
     cin>>a[i].begin>>a[i].end;
 }
 int temp;
 for(int i=0;i<n;i++)//按结束时间从早到晚排序
  for(int j=1;j<n-i;j++)
     {
         if(a[j-1].end>a[j].end)
         {
            temp=a[j-1].end;
           a[j-1].end=a[j].end;
           a[j].end=temp;
           temp=a[j-1].begin;
           a[j-1].begin=a[j].begin;
           a[j].begin=temp;
         }
     }
  int ans=1,end_time=a[0].end;
   for(int i=1;i<n;i++)
   {
       if(a[i].begin>=end_time)//当活动的开始时间在上个活动结束后  
       {
           end_time=a[i].end;//更新活动结束时间  
           ans++;//活动数+1
       }
   }
   cout<<ans<<endl;
return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法是一种问题求解方法,它在每一步总是做出当前情况下的最优选择,以期望获得最优解。而"最大整数"同样可以使用贪心算法来求解。 对于"最大整数"的问题,我们可以考虑如下的贪心策略:从高位开始,尽可能选择较大的数字。具体步骤如下: 1. 对于给定的整数,我们首先将其转化为一个数组,其中每个元素表示整数的一个位数。 2. 从最高位(最左侧)开始,遍历数组。 3. 对于当前位上的数字,从9开始递减,找到第一个小于等于当前数字的最大数字。 4. 如果找到了符合条件的最大数字,将其放在当前位。否则,不做任何操作。 5. 继续向下遍历,重复步骤3-4。 6. 最终,得到的数组即为满足条件的最大整数。 以一个具体的例子说明上述算法:假设给定的整数为5372。 1. 将整数转化为数组[5, 3, 7, 2]。 2. 从最高位开始遍历。 3. 对于第一位5,从9开始递减,找到第一个小于等于5的数字,为7。 4. 将7放在第一位,得到[7, 3, 7, 2]。 5. 对于第二位3,从9开始递减,找到第一个小于等于3的数字,为3(与当前数字相等)。 6. 不做任何操作,得到[7, 3, 7, 2]。 7. 对于第三位7,从9开始递减,找到第一个小于等于7的数字,为7。 8. 将7放在第三位,得到[7, 3, 7, 2]。 9. 对于第四位2,从9开始递减,找到第一个小于等于2的数字,为2。 10. 将2放在第四位,得到[7, 3, 7, 2]。 11. 遍历结束,最终得到的数组为[7, 3, 7, 2],转化为整数为7372。 通过上述贪心算法,我们得到了满足条件的最大整数7372。证明了贪心算法在"最大整数"问题中的有效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值