C++代码实现:
//安排会议问题,输入开始与结束时间,输出可以安排的最多的会议数
//按结束时间从小到大排序,然后与开始时间不重叠
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
struct Meet{
int begin;
int end;
int num;//会议编号
}meet[100];
class setmeet{
public:
void init();
void slove();
private:
int n, ans;//N会议总数,ans:最大能安排的会议数
};
//读入数据
void setmeet::init(){
int s, e;
cout << "输入会议总数" << endl;
cin >> n;
cout << "输入会议的开始时间和结束时间,以空格隔开" << endl;
for (int i = 0; i < n; i++){
cin >> s >> e;
meet[i].begin = s;
meet[i].end = e;
meet[i].num = i + 1;
}
}
//按结束时间从小到大排序
bool cmp(Meet x, Meet y){
if (x.end == y.end){
return x.begin>y.begin;
}
return x.end < y.end;
}
void setmeet::slove(){
//按会议结束时间从小到大排序
sort(meet, meet + n, cmp);
//排完序的会议顺序为
cout << "排完序的会议顺序为" << endl;
cout << "会议编号" << "会议开始时间" << "会议结束时间" << endl;
for (int i = 0; i < n; i++){
cout << meet[i].num <<"\t\t"<< meet[i].begin <<"\t\t"<< meet[i].end << endl;
}
cout << "选择会议过程" << endl;
ans = 1;
int last = meet[0].end;//选择第一个会议的结束时间
cout << "选择第" << meet[0].num << " 个会议" << endl;
for (int i = 1; i < n; i++){
if (meet[i].begin >= last){
ans++;
last = meet[i].end;
cout << "选择第" << meet[i].num << "个会议" << endl;
}
}
cout << "最多可以安排" << ans << "次会议" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
setmeet st;
st.init();
st.slove();
return 0;
}
C代码实现:要注意,排序后要交换结构体数组里的所有项的值.
//安排会议问题,输入开始与结束时间,输出可以安排的最多的会议数
//按结束时间从小到大排序,然后与开始时间不重叠
#include "stdafx.h"
#include <stdio.h>
#pragma warning(disable:4996)
struct Meet{
int beg;
int end;
int num;
}meet[100];
void insertStore(struct Meet a[], int n);
int _tmain(int argc, _TCHAR* argv[])
{
int n;
printf("请输入会议总数n\n");
scanf("%d", &n);
printf("请依次输入会议的开始时间和结束时间,用空格隔开\n");
for (int i = 0; i < n; i++){
scanf("%d%d", &meet[i].beg, &meet[i].end);
meet[i].num = i + 1;
}
for (int i = 0; i < n; i++){
printf("输出排序前的序列为:会议编号%d 开始时间%d 结束时间 %d\n", meet[i].num, meet[i].beg, meet[i].end);
}
//按结束时间从小到到排序,自己写个插入排序的算法
insertStore(meet, n);
for (int i = 0; i < n; i++){
printf("输出排序好的序列为:会议编号%d 开始时间%d 结束时间 %d\n", meet[i].num, meet[i].beg, meet[i].end);
}
//选择会议
int ans=1;//可选择会议的最大数
int last = meet[0].end;
printf("首次选择的会议为%d", meet[0].num);
for (int i = 1; i < n; i++){
if (meet[i].beg >= last){
ans++;
last = meet[i].end;
printf("可选择的会议为%d", meet[i].num);
}
}
printf("最多可开的会议数为 %d", ans);
return 0;
}
void swap(struct Meet a[], int i, int j){
a[i].end = a[i].end + a[j].end;
a[j].end = a[i].end - a[j].end;
a[i].end = a[i].end - a[j].end;
//
a[i].beg = a[i].beg + a[j].beg;
a[j].beg = a[i].beg - a[j].beg;
a[i].beg = a[i].beg - a[j].beg;
//
a[i].num = a[i].num + a[j].num;
a[j].num = a[i].num - a[j].num;
a[i].num = a[i].num - a[j].num;
}
/* 直接插入排序算法,自己写
实现升序排列*/
void insertStore(struct Meet a[], int n){
for (int i = 1; i < n ; i++){
for (int j = 0; j < i; j++){
if (a[j].end>a[j + 1].end)swap(a, j, j + 1);
else if (a[j].end == a[j + 1].end){
if (a[j].beg>a[j + 1].beg)swap(a, j, j + 1);
}
}
}
}