我的贪心策略:
但是爆0了,有什么问题吗
#include<bits/stdc++.h>
#define M 100005
#define N 10005
#define LL long long
using namespace std;
struct p{
LL be,ed;
LL fr,to;
};
p a[M];
struct s{
LL id,num;
};
s bucket[N];
vector<LL> sta[N];
LL n,m,k;
LL d[N],del[N];
bool cmp(s a, s b){
LL cost_a = min(d[a.id],k)*bucket[a.id].num;
LL cost_b = min(d[b.id],k)*bucket[b.id].num;
return cost_a > cost_b;
}
int main()
{
cin >> n >> m >> k;
for(LL i = 1; i < n; i ++) cin >> d[i];
for(LL i = 1; i <= m; i ++) cin >> a[i].be >> a[i].fr >> a[i].to;
for(LL i = 1; i <= n; i ++) bucket[i].id = i;
for(LL i = 1; i <= m; i ++){
for(LL j = a[i].fr; j < a[i].to; j ++){
sta[j].push_back(i);
}
}
for(LL i = 1; i <= n; i ++){
bucket[i].id = i;
bucket[i].num = sta[i].size();
}
sort(bucket+1,bucket+1+n,cmp);
for(LL i = 1; i <= n; i ++){
if(k >= d[bucket[i].id]){
d[bucket[i].id] = 0;
k -= d[bucket[i].id];
}
else{
d[bucket[i].id] -= k;
k = 0;
break;
}
}
for(LL i = 1; i <= n; i ++){
LL maxn = 0;
for(auto j : sta[i]){
maxn = max(a[j].be,maxn);
}
for(auto j : sta[i]){
a[j].ed = maxn;
a[j].ed += d[i];
}
}
LL ans = 0;
for(LL i = 1; i <= m; i ++){
ans += (a[i].ed - a[i].be);
}
cout << ans;
return 0;
}