貪心-*活動選擇

HowieLee59發表於2019-04-02

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
#include<stdio.h>
#include<string.h>

struct node{
    int start;
    int end;
    int select;
    int id;
}a[100],temp;


int main(){
    int b;
    scanf("%d",&b);
    for(int i = 0 ; i < b ; i++){
        scanf("%d %d",&a[i].start,&a[i].end);
        a[i].id = i + 1;
        a[i].select = 0;
    }
    for(int i = 0 ; i < b - 1;i++){
        for(int j = 0 ; j < b - i - 1;j++){
            if(a[j].end > a[j+1].end){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
    int s = 0;
    for(int i = 0 ; i < b ;i++){
        if(a[i].start >= s){
            a[i].select = 1;
            s = a[i].end;
        }
    }
    printf("%d",a[0].id);
    for(int i = 1 ; i < b ; i++){
        if(a[i].select == 1){
            printf(",%d",a[i].id);
        }
    }
    printf("\n");
    return 0;
}

 

相關文章