2023年牛客基础训练营2-I

题目链接:https://ac.nowcoder.com/acm/contest/46810/I

乱搞题,但是有一些差分思想在里面。

先将所有的$$x_i都设置为第一个等级。

注意到一个性质,不是所有的h都可以使答案发生变化。

然后我们可以先求出所有可以使\(x_i\)发生变化的h的最小值,接着从小到大枚举所有h。所有\(x_i都会使按照\)v_0v_1v_2v_3v_4$的顺序走的,不可能会跳过任意一个。所以,通过枚举h的方式,我们也就求出了所有情况,答案取最大值即可。

代码:


#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int>P;
map<long long,vector<P>>M;
long long score[10],kan[10];
long long num[200010];
void solve(){
    M.clear();
    int n;
    cin>>n;
    long long INF = 1e18;
    for (int i=1;i<=n;i++){
        int x;
        cin>>x;
        num[i] = x-INF;
    }
    for (int i=1;i<=4;i++) cin>>kan[i];
    for (int i=0;i<=4;i++) cin>>score[i];
    long long ans = 1ll*n*score[0];
    for (int i=1;i<=n;i++){
        for (int j=1;j<=4;j++){
            M[kan[j]-num[i]+(j==4)].push_back({j-1,j});
        }
    }
    long long temp = ans;
    for (auto per:M){
        for (auto val:per.second){
            temp -= score[val.first];
            temp += score[val.second];
        }
        ans = max(ans,temp);
    }
    cout<<ans<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    T = 1;
    cin>>T;
    while(T--) solve();
    return 0;
}

posted @ 2023-04-10 22:42  安潇末痕  阅读(33)  评论(0)    收藏  举报