acm_1004

题意:

这道题和之前上课时的那个会场活动安排的差不多。大体意思就是已知有N个节目和这N个节目开始和结束的时间,安排出最合理的顺序,使可以看到最多的节目。

输入:

输入一个正整数N表示节目数,然后输入这N个节目的开始和结束的时间(全是正整数),若输入的节目数为0,表示输入停止,不做任何处理。

输出:输出一个正整数,表示能看到的节目数

解题思路:

这道题用贪心很合适。要求能完整看的节目数,首先要对电视节目构造一个结构体变量,有开始和结束的时间,然后把电视节目用一个数组表示出来,依照结束时间的升序对电视节目排序,然后第一个肯定要看,之后看下一个电视节目的开始时间是不是比上一个节目的结束时间小,如果小,这个节目和上一个有冲突,再往后面找下一个,如果比它大的话,这个节目就可以选。这样找到最后,就可以构成一个解集合。

感想:

这是我用贪心算法做的第一个题,感觉特高兴。我觉得贪心算法最重要的是找准它的贪心方法,这个找到的话,其他的就是纯粹的写代码了,写代码的时候要注意数组越界的问题,这种方法经常要用到数组,关于数组越界的问题要引起重视。其他还有一些小细节,只要我们认真写,认真调,还是不难AC的。

代码如下:

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

struct TVshow {

int StartTime;

int OverTime;

};

bool cmp(const TVshow &t1, const TVshow &t2)

{

if (t1.OverTime < t2.OverTime)

return true;

else

return false;

}

void SelectShow(int n, TVshow a[], bool b[])

{

b[0] = true;

int LastOvertime = 0;

for (int i = 1; i < n; i++)

{

if (a[i].StartTime >= a[LastOvertime].OverTime)

{

b[i] = true;

LastOvertime = i;

}

else

b[i] = false;

}

}

int main()

{

void SelectShow(int n, TVshow a[], bool b[]);

bool cmp(const TVshow &t1, const TVshow &t2);

int n;

TVshow tv[100];

bool b[100];

while (cin >> n)

{

if (n == 0)

break;

else

{

for (int i = 0; i < n; i++)

{

cin >> tv[i].StartTime >> tv[i].OverTime;

}

sort(tv, tv + n , cmp);

SelectShow(n, tv, b);

int result = 0;

for (int i = 0;i<n;i++)

if(b[i])

result++;

cout << result << endl;

}

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值