傳送門
解題思路
先把所有的數據讀下來。
對於地鐵,答案直接加,然后把編號放入一個數組a內。
對於公交車,從前往后枚舉a數組,然后找到出現最早的且符合價錢大於等於公交車的價錢,然后把這個數刪除(變為0)。
然后再考慮有效期是45分鍾,為了優化時間,我們可以每一次把數組看做一個隊列,當a[first]是0或者時間超過了45分鍾時,first++。
這樣就保證了數組內的數不超過45個。
最后看一眼時間復雜度,O(NK),K為不超過45。
輕松A掉。
AC代碼
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int maxn=100005; 5 int n,x,p[maxn],t[maxn],a[maxn],cnt,fir=1; 6 long long ans; 7 int main() 8 { 9 cin>>n; 10 for(int i=1;i<=n;i++){ 11 scanf("%d%d%d",&x,&p[i],&t[i]); 12 while(fir<=cnt&&(a[fir]==0||t[i]-t[a[fir]]>45)) fir++; 13 ans+=p[i]; 14 if(x==0){ 15 a[++cnt]=i; 16 }else{ 17 for(int j=fir;j<=cnt;j++){ 18 if(a[j]==0) continue; 19 if(p[i]<=p[a[j]]){ 20 a[j]=0; 21 ans-=p[i]; 22 break; 23 } 24 } 25 } 26 } 27 cout<<ans<<endl; 28 return 0; 29 }
//CSP2019普及組 t2