您的位置:首页 > 其它

NOIP提高组2011 观光公交

2016-11-01 19:26 357 查看
贪心。
每次加速器都要用在人最多的地方。
并且不能出现车子在等人的情况,否则就算加速也没什么用。

#include<cstdio>

const int N=111111;

int t
,a
,b
,d
,sum
,Time
,f
,g
;
int n,m,k,ans;

int max(int A,int B)
{
return A>B? A:B;
}

int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<n;i++) scanf("%d",&d[i]);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&t[i],&a[i],&b[i]);
f[a[i]]=max(t[i],f[a[i]]);
++sum[b[i]];
}
for (int i=2;i<=n;i++) sum[i]=sum[i]+sum[i-1];
Time[1]=0;
for (int i=2;i<=n;i++) Time[i]=max(Time[i-1],f[i-1])+d[i-1];
ans=0;
for (int i=1;i<=m;i++) ans=ans+Time[b[i]]-t[i];
while (k)
{
g[n-1]=n;
for (int i=n-2;i>=1;i--)
if (f[i+1]>=Time[i+1]) g[i]=i+1;else g[i]=g[i+1];
int mx=0,u=0;
for (int i=1;i<=n;i++)
if (sum[g[i]]-sum[i]>mx&&d[i]>0) mx=sum[g[i]]-sum[i],u=i;
if (!u) break;
d[u]--;k--;ans=ans-mx;
Time[1]=0;
for (int i=2;i<=n;i++) Time[i]=max(Time[i-1],f[i-1])+d[i-1];
}
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: