有n项工作,每项工作分别在si开始,fi结束。对于每项工作,你都可以选择参加或者不参加,选择参加就必须全程参与(开始和结束时间不可重复),问最多可以参加多少项工作。
思路:选择最早结束的工作,这样才能留下时间选择更多工作
注:已排序
#include <stdio.h>
template<class T>
void choose(int n,T s[],T f[],bool a[])
{
a[0]=true;
int j=0;
for(int i=1;i<n;i++)
if(s[i]>=f[j])
{
a[i]=true;
j=i;
}
else
a[i]=false;
}
int main(int argc, char** argv) {
int n;
scanf("%d",&n);
int s[n];
int f[n];
for(int i=0;i<n;i++)
scanf("%d%d",&s[i],&f[i]);
bool a[n+1];a
choose(n,s,f,a);
printf("可以进行的工作:\n");
for(int i=0;i<n;i++)
if(a[i])
printf("[%d]:(%d,%d)\n",i,s[i],f[i]);
return 0;
}
或:
#include <stdio.h>
template<class T>
void GreedySelector(int n,T s[],T f[]); //函数声明
int main()
{
int i,n,s[100],f[100];
printf("总工作量:");
scanf("%d",&n);
printf("各工作开始时间和结束时间分别为:\n");
for(i=0;i<n;i++)
scanf("%d%d",&s[i],&f[i]); //输入各工作开始和结束时间
GreedySelector(n,s,f); //函数调用
return 0;
}
template<class T>
void GreedySelector(int n,T s[],T f[]) //函数定义
{
int j=0,i,sum=1;
printf("可以选择的工作时间:\n");
printf("%d %d\n",s[0],f[0]);
for(i=1;i<n;i++)
{
if(s[i]>f[j]) //将后一个工作开始时间与前一个工作结束比较
{
sum++;
printf("%d %d\n",s[i],f[i]);
j=i; //若相容,则比较下一个
}
}
printf("最大工作量:");
printf("%d\n",sum);
}
注:未排序
#include <iostream>
#include <algorithm>
using namespace std;
struct act
{
int start;
int end;
}acts[100];//相当于struct act acts[100],结构数组
bool cmp(const act &a, const act &b)
{
return a.end < b.end;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>acts[i].start>>acts[i].end;
}
sort(acts,acts+n,cmp);//按结束时间从早到晚排序
bool A[100];//表示第i个工作选不选
int j=1;
int sum=1;
A[1]=true;//第一个肯定选
for(int i=2;i<=n;i++){
if(acts[i].start>acts[j].end)
{
sum++;
A[i]=true;
j=i;
}
else A[i]=false;
}
cout<<"选择以下工作:"<<endl;
for(int i=1;i<=n;i++)
{
if(A[i]==true)
cout<<acts[i].start<<" "<<acts[i].end<<endl;
}
cout<<"选择工作数:"<<sum<<endl;
}
结构数组成员的访问是以数组元素为结构变量的, 其形式为: 结构数组元素.成员名
相当于一个二维构造, 第一维是结构数组元素, 每个元素是一个结构变量, 第二维是结构成员。