SDUT_活動選擇_貪心

活動選擇

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

學校的大學生藝術中心週日將面向全校各個學院的學生社團開放,但活動中心同時只能供一個社團活動使用,並且每一個社團活動開始後都不能中斷。現在各個社團都提交了他們使用該中心的活動計劃(即活動的開始時刻和截止時刻)。請設計一個算法來找到一個最佳的分配序列,以能夠在大學生藝術中心安排不衝突的儘可能多的社團活動。
比如有5個活動,開始與截止時刻分別爲:



最佳安排序列爲:1,4,5。

Input

第一行輸入活動數目n(0<n<100);
以後輸入n行,分別輸入序號爲1到n的活動使用中心的開始時刻a與截止時刻b(a,b爲整數且0<=a,b<24,a,b輸入以空格分隔)。

Output

輸出最佳安排序列所包含的各個活動(按照活動被安排的次序,兩個活動之間用逗號分隔)。

Sample Input

6
8 10
9 16
11 16
14 15
10 14
7 11

Sample Output

1,5,4

Hint

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct activity{
	int tag;
	int begin;
	int end;
}activity;
struct activity act[100];
int res[100];
bool cmp(struct activity x,struct activity y){
	return x.end<y.end;
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d",&act[i].begin,&act[i].end);
		act[i].tag=i+1;
	}
	sort(act,act+n,cmp);
	bool a[100];
	a[0]=true;
	int j=0;
	for(int i=1;i<n;i++){
		if(act[i].begin>=act[j].end){     //貪心算法 
			a[i]=true;
			j=i;
		}
		else{
			a[i]=false;
		}
	}
	int p=0;
	for(int i=0;i<n;i++){
		if(a[i]){
			res[p++]=act[i].tag;
		}
	}
	
	for(int i=0;i<p;i++){           //排版需要 
		if(i==p-1){
			printf("%d\n",res[i]);
		}
		else{
			printf("%d,",res[i]);
		}
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章