1.题目编号
1004 problemE
2.简单题意
Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
3.解题思路
关于贪心算法的一个实例,运用课上说的相关知识进行简单改变:
(1).排序 按照结束时间由早到晚进行排序
(2).选择 将最早的一个排在第一位上,然后选择与第一个不冲突的节目排在其后,然后依次规律进行排序
(3).输出 定义一个数每拍了一个节目就自加一,最后输出此数。
4.感觉
贪心算法的一次巩固,对照例题进行补充
5.代码
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
struct action
{
int Tis;
int Tie;
bool b;
};
bool cmp(const action &a,const action &b)
{
return a.Tie<=b.Tie;
}
int main()
{
int n;
while(cin>>n&&n!=0)
{
if(n==0) break;
vector<action> a(n);
vector<action>::iterator it1,it2;
for(int i=0;i<n;i++)
{
cin>>a[i].Tis;
cin>>a[i].Tie;
a[i].b=0;
}
sort(a.begin(),a.end(),cmp);
it2=a.begin();
(*it2).b=1;
int p=1;
for(it1=a.begin()+1;it1!=a.end();it1++)
{
if((*it2).b=1&&(*it1).Tis>=(*it2).Tie)
{
(*it1).b=1;
it2=it1;
p++;
}
}
cout<<p<<endl;
}
}
#include<iostream>
#include<vector>
using namespace std;
struct action
{
int Tis;
int Tie;
bool b;
};
bool cmp(const action &a,const action &b)
{
return a.Tie<=b.Tie;
}
int main()
{
int n;
while(cin>>n&&n!=0)
{
if(n==0) break;
vector<action> a(n);
vector<action>::iterator it1,it2;
for(int i=0;i<n;i++)
{
cin>>a[i].Tis;
cin>>a[i].Tie;
a[i].b=0;
}
sort(a.begin(),a.end(),cmp);
it2=a.begin();
(*it2).b=1;
int p=1;
for(it1=a.begin()+1;it1!=a.end();it1++)
{
if((*it2).b=1&&(*it1).Tis>=(*it2).Tie)
{
(*it1).b=1;
it2=it1;
p++;
}
}
cout<<p<<endl;
}
}