兩道都是經典的貪心題。
活動安排我真是。。信心滿滿地交了三遍然後就心態崩了。
先說今年暑假不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;
}