[NOIP2011 提高組] 觀光公交
阿新 • • 發佈:2022-02-09
笑死 不開long long 見祖宗
#include<bits/stdc++.h> using namespace std; int n,m,k,dis[1010]; struct node{ int t,u,v; }a[100010]; int sum[10100],maxx;//每站人數 最多影響人數 int last[10100],sc[10100],g[10100];//沒有時間觀念的先生們 long long ans; int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<n;i++) { scanf("%d",&dis[i]); } for(int i=1;i<=m;i++) { scanf("%d%d%d",&a[i].t,&a[i].u,&a[i].v); } for(int i=1;i<=m;i++) { last[a[i].u]=max(last[a[i].u],a[i].t);//開始時間 sum[a[i].v]++; } for(int i=1;i<=n;i++) { sum[i]+=sum[i-1];//各站點人數 } sc[1]=last[1]; for(int i=2;i<=n;i++) { sc[i]=max(sc[i-1],last[i-1])+dis[i-1];//出站時間 } for(int i=1;i<=m;i++) { ans+=sc[a[i].v]-a[i].t;//無加速器 } while(k) { k--; g[n]=g[n-1]=n; maxx=-1; int best_id; for(int i=n-2;i>=1;i--) { if(sc[i+1]<=last[i+1]) g[i]=i+1;//需要等 else g[i]=g[i+1]; } for(int i=1;i<n;i++) { if(sum[g[i]]-sum[i]>maxx && dis[i]>0)//可以為更多人節省時間 { maxx=sum[g[i]]-sum[i]; best_id=i; } } ans-=maxx; dis[best_id]--;//可能小於0 for(int i=2;i<=n;i++) { sc[i]=max(sc[i-1],last[i-1])+dis[i-1];//更新出站時間 } } printf("%lld",ans); return 0; }
先計算總時間在一個人一個人地減是比較好的
其次對於while內第一個迴圈,應該加一句
if(dis[i]==0)
{
g[i]=0;
continue;
}
但不加也能過 這個迴圈正著推要兩層迴圈會炸