题意:
这道题和之前上课时的那个会场活动安排的差不多。大体意思就是已知有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;
}