安排会议问题

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);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/guangod/article/details/81867086