1. 程式人生 > >【NOJ1205】【貪心演算法】活動安排

【NOJ1205】【貪心演算法】活動安排

1205.活動安排

時限:1000ms 記憶體限制:10000K  總時限:3000ms

描述

Jack是一名nwpu的大一新生,對學校舉辦的各種活動都十分的好奇,想盡可能多的參加這些活動。Npwu每天共有N項活動,其開始結束時間分別為B[i],E[i],(i = 1,2,……N) 請問Jack一天最多能參加幾項活動。當然,Jack在同一時間內只能參加一項活動,即jack參加的活動時間上不能重疊,但時間為[t1,t2],[t2,t3]的兩個活動是可以同時參加的

輸入

第一行 一個整數N(1<=n<=1000)表示活動總數。 接下來N行表示各活動的起始,結束時間0<=B[i]<E[i]<24

輸出

一個整數表示Jack最多能參加的活動數目。

#include <iostream>

using namespace std;

//貪心演算法

int n;
int b[1001];
int e[1001];

int endcur; //當前已參加活動的結束時間,簡稱當前結束時間
int cnt;    //當前已參加活動的數目

int main()
{
    //輸入資料
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>b[i]>>e[i];
    }

    //按結束時間遞增排序
    for(int i=0; i<n; i++)
    {
        for(int j=i; j<n; j++)
        {
            if(e[j]<e[i])
            {
                swap(e[i],e[j]);
                swap(b[i],b[j]);
            }
        }
    }

    //貪心演算法,按結束時間遞增順序遍歷所有活動
    //只要能參加的都參加
    endcur=e[0];    //先參加第一個活動
    cnt=1;
    for(int i=1; i<n; i++)
    {
        if(b[i]>=endcur) //如果第i個活動開始時間,比當前結束時間晚/相同
        {
            cnt++;          //這個活動可以參加
            endcur=e[i];    //更新一下當前結束時間
        }
        else    //參加不了就換下一個
        {
            continue;
        }
    }

    cout<<cnt<<endl;

    return 0;
}

【後記】

1.做這道題的時候,突然想起上個假期吭哧吭哧刷杭電oj的自己,那時候只自學了一點點資料結構,還沒學演算法,也完全沒寫過C++,憑著自己並不聰明的腦子硬AC出來六十來道題,印象最深的就是卡在了這道題上。現在一看,當初自己稚嫩的想法其實就是貪心演算法的思想,而這道題實在是太簡單了。想當初的當初,學C語言的時候,天天發愁記不住氣泡排序,現在隨手即來了。

2.越想越勵志,敬大三轉專業的自己。