zoukankan      html  css  js  c++  java
  • 洛谷 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

  • 相关阅读:
    [HEOI2014]南园满地堆轻絮
    [HEOI2016/TJOI2016]树
    初赛知识点
    [10.4模拟赛]T2
    [ZJOI2012]灾难
    [SDOI2010]古代猪文
    [9.26模拟赛]T1
    [9.26模拟赛]T3
    [9.26模拟赛]T2
    [9.19模拟赛]最小粒子数
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/11967537.html
Copyright © 2011-2022 走看看