51nod 1428活動安排 HDU 2037 今年暑假不AC 比較

兩道都是經典的貪心題。
活動安排我真是。。信心滿滿地交了三遍然後就心態崩了。

先說今年暑假不AC。
今年暑假不AC就是給很多個a b。a表示開始時間,b表示結束時間。一對a b就表示一個節目。想要看盡量多的節目數。當時寫這個題的時候也是別人跟我說按結束時間排序。也沒多想。結果做活動安排的時候就掉坑裏了。
爲什麼是按結束時間排序呢?假設給一組數據。4個節目。1 2。3 6。4 5。5 7。
如果是按開始時間排序。就是和給出的數據那樣。你就只能看兩個節目。
但是如果按結束時間排序呢?就變成了。1 2。4 5。3 6。5 7。你就可以看三個節目。

現在看活動安排的題目。

有若干個活動,第i個開始時間和結束時間是[Si,fi),同一個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室?
輸入
第一行一個正整數n (n <= 10000)代表活動的個數。
第二行到第(n + 1)行包含n個開始時間和結束時間。
開始時間嚴格小於結束時間,並且時間都是非負整數,小於1000000000
輸出
一行包含一個整數表示最少教室的個數。

我一開始看這個題。一下就想到了今年暑假不AC那個題。信誓旦旦的和隊友說這水題十分鐘就寫完了先寫水題吧。按結束時間排序寫了一遍結果WA。然後我就以爲是排序的時候沒有考慮結束時間相同的。因爲結束時間相同的肯定要挑選開始時間早的啊。結果再交兩發還是錯。隊友過來敲了一遍一摸一樣的也是錯。。這就很尷尬了。

後來想想其實是這樣的。你不應該選擇能看的次數最多。你應該選擇佔用的時間最長。這樣纔是最有效的。就是對於這個教室來說被佔用的時間最長是最好的。而不是安排的活動最多。所以應該選擇開始時間排序。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct data{
    int sta;
    int en;
    int ok;
}a[100005];
int cmp(struct data p,struct data q){
    return p.sta<q.sta;
}
int main(void){
    int n,temp,ans,starend;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%d%d",&a[i].sta,&a[i].en);
            a[i].ok=1;
        }
        sort(a,a+n,cmp);
        ans=temp=starend=0;
        //cout<<endl;
        while(temp<n){
            starend=0;
            for(int i=0;i<n;i++){
                if(a[i].sta>=starend&&a[i].ok){
                    temp++;
                    a[i].ok=0;
                    //cout<<a[i].sta<<" "<<a[i].en<<endl;
                    starend=a[i].en;
                }
            }
            ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

後來補題的時候寫得很急還交錯一發。再一次說明了心態至關重要啊。

後來學長和我說了另一種方法非常機智。就不用考慮這麼多東西。
就是對時間點進行排序。只要標記一下操作就好了。比如我申請了一個房間。我就要ans++。退掉一個房間就ans–。最後記錄一下ans在過程中的最大值就好了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct data{
    int t;
    int ok;
};
struct data h[20005];
int cmp(struct data p,struct data q){
    if(p.t==q.t){//這個地方稍微注意一下。在這被卡了一會。總是忽略相同的情況。。WA兩發一頓改bug才發現是小問題。。很氣。
        return p.ok<q.ok;
    }
    return p.t<q.t;
}
int max(int p,int q){
    return p>q?p:q;
}
int main(){
    int n,temp,ans,j;
    while(~scanf("%d",&n)){
        ans=temp=j=0;
        for(int i=0;i<n;i++){
            scanf("%d",&h[j].t);
            h[j].ok=1;
            j++;
            scanf("%d",&h[j].t);
            h[j].ok=0;
            j++;
        }
        //cout<<j<<endl;
        sort(h,h+j,cmp);
        for(int i=0;i<j;i++){
            //cout<<h[i].t<<" ";
            if(h[i].ok==0){
                temp--;
            }
            else temp++;
            //cout<<temp<<endl;
            ans=max(ans,temp);
        }
        printf("%d\n",ans);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章