贪心策略
查看原帖
贪心策略
416242
New_hope楼主2023/8/1 16:28

我的贪心策略:

  • 先预处理出所有车站上的人数(不包括在本站下车的人)
  • 根据加速器的贡献排序
  • 修改距离
  • 累加输出

但是爆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;
}
2023/8/1 16:28
加载中...