zoukankan      html  css  js  c++  java
  • 洛谷 P1315 观光公交(贪心+模拟)

    题目链接:https://www.luogu.com.cn/problem/P1315

    设$p_i$为车到达时间,$c_i$为有多少人终点在i,$t_i$为出发时间,那么$ans= sum p_i*c_i- sum t_i$,让它最小。

    这道题注意用了一个氮气,它所造成的影响是后面的一个区间,是在这个区间内下车的人,直到被last卡到。

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 const int N=10005;
     8 int n,m,k,ans,T;
     9 int maxn,pos;
    10 int d[N];
    11 struct node{
    12     int end,off,arr,ti,st,last;
    13 }q[N];
    14 int main(){
    15     scanf("%d%d%d",&n,&m,&k);
    16     for(int i=1;i<n;i++) scanf("%d",&d[i]);
    17     for(int i=1;i<=m;i++){
    18         scanf("%d%d%d",&q[i].ti,&q[i].st,&q[i].end);
    19         q[q[i].st].last=max(q[q[i].st].last,q[i].ti);
    20         q[q[i].end].off++;
    21     }
    22     for(int i=1;i<=n;i++){
    23         q[i].arr=T;
    24         T=max(T,q[i].last);
    25         T+=d[i];
    26     }
    27     while(k--){
    28         maxn=0;
    29         for(int i=2;i<=n;i++){
    30             if(!d[i-1]) continue;
    31             int t=0;
    32             for(int j=i;j<=n;j++){
    33                 t+=q[j].off;
    34                 if(q[j].arr<=q[j].last) break;
    35             }
    36             if(t>maxn) maxn=t,pos=i;
    37         }
    38         d[pos-1]--;
    39         for(int i=pos;i<=n;i++){
    40             q[i].arr--;
    41             if(q[i].arr<q[i].last) break;
    42         }
    43     }
    44     for(int i=1;i<=m;i++) ans+=q[q[i].end].arr-q[i].ti;
    45     printf("%d",ans);
    46     return 0;
    47 }
    AC代码
  • 相关阅读:
    重拾数学--初中--有理数
    Python中的运算符
    PyQt5实现虚拟摇杆
    Python无重复字符的最长子串
    Python两数相加
    Python两数之和
    DBMS,B树和B+树
    浮点数表示
    Lamada表达式
    Java编程思想P159页的错误
  • 原文地址:https://www.cnblogs.com/New-ljx/p/13444008.html
Copyright © 2011-2022 走看看