文章目录
1: 模板题目:安排最多的会议
算法核心
- 结构体排序
- 算法思想
/*自己写的版本,朴素的mappao*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
//定义允许的最大活动数
#define Maxn 100
//定义活动的类型
typedef struct act_Node
{
int Id; //活动ID
int endtime; //活动开始时间
int beg; //活动结束时间
} ACND;
//对活动按贪心准则排序
//冒泡排序
void Sort(int n,ACND arr[])
{
int i,j,tmp;
int flag; // 标记
for (i=n-1; i>0; i--)
{
flag = 0; // 初始化标记为0
// 将a[0...i]中最大的数据放在末尾
for (j=0; j<i; j++)
{
if (arr[j].endtime > arr[j+1].endtime)
{
swap(arr[j],arr[j+1]);
flag = 1; // 若发生交换,则设标记为1
}
else if(arr[j].endtime==arr[j+1].endtime)
{
if(arr[j].beg<arr[j+1].beg);
{
swap(arr[j],arr[j+1]);
}
}
}
if (flag==0)
break; // 若没发生交换,则说明数列已有序。
}
}
//进行贪心选择,得到最大相容的活动集合输出
void Select(int n,ACND arr[])
{
int last;
last=arr[0].endtime;
cout<<arr[0].Id<<":"<<" "<<arr[0].beg<<"-"<<arr[0].endtime<<endl;
for(int i=1;i<n;i++)
{
if(arr[i].beg>last)
{
last=arr[i].endtime;
cout<<arr[i].Id<<":"<<" "<<arr[i].beg<<"-"<<arr[i].endtime<<endl;
}
}
}
int main()
{
freopen("1.txt","r",stdin);
std::ios::sync_with_stdio(false);
ACND arr[Maxn];
int an,i;
cin>>an; //读入活动个数
//读入各个活动的编号和占用资源的起止时间
for(i=0; i<an; i++)
cin>>arr[i].Id>>arr[i].beg>>arr[i].endtime;
//对活动按贪心准则进行排序
Sort(an,arr);
//进行贪心选择,获得最优解并输出s
Select(an,arr);
return 0;
}
/*趣学算法,用到了C++的sort()用于结构体排序*/
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct Meet
{
int beg; //会议的开始时间
int end; //会议的结束时间
int num; //记录会议的编号
}meet[1000]; //会议的最大个数为1000
class setMeet{
public:
void init();
void solve();
private:
int n,ans; // n:会议总数 ans: 最大的安排会议总数
};
//读入数据
void setMeet::init()
{
int s,e;
cout <<"输入会议总数:"<<endl;
cin >> n;
int i;
cout <<"输入会议的开始时间和结束时间,以空格分开:"<<endl;
for(i=0;i<n;++i)
{
cin>>s>>e;
meet[i].beg=s;
meet[i].end=e;
meet[i].num=i+1;
}
}
bool cmp(Meet x,Meet y)
{
if (x.end == y.end)
return x.beg > y.beg;
return x.end < y.end;
}
void setMeet::solve()
{
sort(meet,meet+n,cmp); //对会议按结束时间排序
cout <<"排完序的会议时间如下:"<<endl;
int i;
cout <<"会议编号:"<<" 开始时间 "<<" 结束时间"<<endl;
for(i=0; i<n;i++)
{
cout<< " " << meet[i].num<<"\t\t"<<meet[i].beg <<"\t"<< meet[i].end << endl;
}
cout <<"-------------------------------------------------"<<endl;
cout << "选择的会议的过程:" <<endl;
cout <<" 选择第"<< meet[0].num<<"个会议" << endl;//选中了第一个会议
ans=1;
int last = meet[0].end; //记录刚刚被选中会议的结束时间
for( i = 1;i < n;++i)
{
if(meet[i].beg>=last)
{ //如果会议i开始时间大于等于最后一个选中的会议的结束时间
ans++;
last = meet[i].end;
cout <<" 选择第"<<meet[i].num<<"个会议"<<endl;
}
}
cout <<"最多可以安排" <<ans << "个会议"<<endl;
}
int main()
{
setMeet sm;
sm.init();//读入数据
sm.solve();//贪心算法求解
return 0;
}