洛谷 P5661 公交換乘 & [NOIP2019普及組] (模擬)


傳送門


解題思路

先把所有的數據讀下來。

對於地鐵,答案直接加,然后把編號放入一個數組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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM