zoukankan      html  css  js  c++  java
  • [NOIP2011] 观光公交

    题意:

    传送门

    题解:

    贪心

    f[i]表示在i号点使用加速器,能使后面多少个点受益

    sum[i]表示在i站及i站以前有多少人下车

    找出在哪个站使用加速器最多能使多少人受益

    贪心k次即可

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define ll long long
    #define N 10100
    using namespace std;
    
    int f[N],sum[N],last[N],a[N],b[N],t[N],d[N],ar[N];
    
    int gi() {
      int x=0,o=1; char ch=getchar();
      while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
      if(ch=='-') o=-1,ch=getchar();
      while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
      return o*x;
    }
    
    int main() {
      int n=gi(),m=gi(),k=gi(); ll ans=0;
      for(int i=1; i<n; i++) d[i]=gi();
      for(int i=1; i<=m; i++) {
        t[i]=gi(),a[i]=gi(),b[i]=gi();
        last[a[i]]=max(last[a[i]],t[i]);
        for(int j=b[i]; j<=n; j++) sum[j]++;
      }
      while(k--) {
        for(int i=2; i<=n; i++) {
          ar[i]=max(ar[i-1],last[i-1])+d[i-1];
        }
        f[n]=0;
        for(int i=n-1; i>=1; i--) {
          if(ar[i+1]>last[i+1]) f[i]=f[i+1]+1;//严格收益
          else f[i]=1;//可能在i+1站下车
        }
        int x,y=0;
        for(int i=1; i<n; i++) {
          if(d[i] && sum[i+f[i]]-sum[i]>y) {
    	y=sum[i+f[i]]-sum[i];
    	x=i;
          }
        }
        d[x]--;
      }
      for(int i=2; i<=n; i++) {
        ar[i]=max(ar[i-1],last[i-1])+d[i-1];
      }
      for(int i=1; i<=m; i++) {
        ans+=ar[b[i]]-t[i];
      }
      printf("%lld
    ", ans);
      return 0;
    }
    
  • 相关阅读:
    第5次系统综合实践
    第4次系统综合实践
    第3次系统综合实践
    第2次实践作业
    第1次实践作业
    第03组 Beta版本演示
    第03组 Beta冲刺(4/4)
    OO第四单元总结
    OO第三单元总结
    OO第二单元总结
  • 原文地址:https://www.cnblogs.com/HLXZZ/p/7660487.html
Copyright © 2011-2022 走看看