记录编号 |
341110 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2011]观光公交 |
最终得分 |
100 |
用户昵称 |
L_in |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.188 s |
提交时间 |
2016-11-07 13:49:40 |
内存使用 |
0.40 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1100
using namespace std;
int n,m,k;
int ans;
struct Peo{
int st,x,y;
}p[10010];//peo
int cnt[maxn],d[maxn];//edge
int go[maxn],arr[maxn];//point
int pre[maxn];//一条边的影响
/*
贪心
一个人的花费完全由结束时间决定
一条边的影响即减去1后会让多少点的到达时间提前
*/
int main(){
freopen("bus.in","r",stdin);
freopen("bus.out","w",stdout);
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",&p[i].st,&p[i].x,&p[i].y);
go[p[i].x]=max(go[p[i].x],p[i].st);
cnt[p[i].y]++;
}
for(int i=1;i<=n;i++)go[i]=max(go[i],go[i-1]);
for(int i=1;i<=n;i++)arr[i]=max(arr[i-1],go[i-1])+d[i-1];
for(int i=1;i<=m;i++)ans+=arr[p[i].y]-p[i].st;
for(int p=1;p<=k;p++){
for(int i=1;i<n;i++)pre[i]=cnt[i+1];//以i+1结尾的点肯定会受到影响
for(int i=n-1;i;i--)
if(arr[i+1]>go[i+1])pre[i]+=pre[i+1];
int id=0;
for(int i=1;i<n;i++)
if(d[i]&&pre[i]>pre[id])id=i;
if(!pre[id])break;
ans-=pre[id];
d[id]--;
for(int i=id+1;i<=n;i++)arr[i]=max(arr[i-1],go[i-1])+d[i-1];
}
printf("%d\n",ans);
fclose(stdin);fclose(stdout);
return 0;
}