why10why10whywhy10?
查看原帖
why10why10whywhy10?
658786
STUDENT00楼主2023/1/14 21:00

代码如下:

#include<bits/stdc++.h>
#define N 1005
#define M 10005
using namespace std;
int n,m,k,d[N],t[M],a[M],b[M],last[N],sum[N],f[N],g[N],ans;
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]),last[a[i]]=max(last[a[i]],t[i]),sum[b[i]]++;
	for(int i=1;i<=n;i++) sum[i]+=sum[i-1];
	f[1]=last[1];
	for(int i=2;i<=n;i++) f[i]=max(f[i-1],last[i-1])+d[i-1];
	for(int i=1;i<=n;i++) ans+=f[b[i]]-t[i];
	while(k--){
		g[n-1]=n;
		for(int i=n-2;i>=1;i--){
			if(last[i+1]>=f[i+1]) g[i]=i+1;
			else g[i]=g[i+1];
		}
		int maxs=0,k=0;
		for(int i=1;i<n;i++){
			int t=sum[g[i]]-sum[i];
			if(t>maxs&&d[i]){
				maxs=t;
				k=i;
			}
		}
		ans-=maxs;
		d[k]--;
		for(int i=2;i<=n;i++) f[i]=max(f[i-1],last[i-1])+d[i-1];
	}
	printf("%d",ans);
	return 0;
}
2023/1/14 21:00
加载中...