模擬考試1 BestCoder Round #2 TIANKENG’s restaurant
阿新 • • 發佈:2018-12-04
本以為是區間覆蓋問題,如果有時間重疊的部分,就加上,雖然區間覆蓋掌握的也不是很好,不知道是按照起始時間還是離開時間排序,之後會再好好複習這方面的習題
起始程式碼
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; struct node { int st; int et; int num; friend bool operator < (node a, node b) { return a.st<b.st; } }ma[10010]; int main() { int t,n,m; scanf("%d",&t); int a,b,c,d; while(t--) { scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d %d:%d %d:%d",&m,&a,&b,&c,&d); ma[i].st=a*60+b; ma[i].et=c*60+d; ma[i].num=m; } sort(ma,ma+n); //for(int i=0; i<n; i++) //{ // printf("%d %d %d\n",ma[i].num,ma[i].st,ma[i].et); //} int mint=ma[0].st,maxt=ma[0].et; int ans=ma[0].num; for(int i=1; i<n; i++) { if(maxt>ma[i].st) { maxt=ma[i].et; ans+=ma[i].num; } } printf("%d\n",ans); } }
後來學到了按照離開時間進行排序(也不知道為什麼),還有ans的更新,但是也是錯的,原來這不是區間覆蓋問題,而是在連續區間覆蓋的時候,第一個區間走之後的椅子可以供下一個區間和下下個區間的人使用,看了正解就自然明白了
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[1000010]; int main() { int t,n,s; int i,j; int max; int hour1,hour2,min1,min2; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a));//一開始要清零 scanf("%d",&n); max=-100;//紀錄最小的座位 for(i=0;i<n;++i) { scanf("%d %d:%d %d:%d",&s,&hour1,&min1,&hour2,&min2);//s表示這個時間段來的人數 int sum1=hour1*60+min1;//每個時間都有一個sum1和sum2這個區間 int sum2=hour2*60+min2; for(j=sum1;j<sum2;++j)//當兩區間有公共部分時,陣列a[i]剛才也存了一個數了 { a[j]+=s; //printf("%d ",a[j]); if(a[j]>max)//當陣列a紀錄的座位數大於max,要把max更新 max=a[j]; } //printf("\n"); } printf("%d\n",max); } return 0; }