传送门


解题思路

先把所有的数据读下来。

对于地铁,答案直接加,然后把编号放入一个数组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

相关文章:

  • 2022-01-13
  • 2018-08-24
  • 2021-07-18
  • 2022-12-23
  • 2021-11-09
  • 2021-08-04
  • 2022-01-09
  • 2021-07-01
猜你喜欢
  • 2021-09-09
  • 2021-05-22
  • 2021-12-06
  • 2021-08-30
  • 2021-10-08
  • 2022-12-23
  • 2021-07-21
相关资源
相似解决方案