记录编号 341110 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2011]观光公交 最终得分 100
用户昵称 GravatarL_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;
}