题目链接: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;
}
标签:int,训练营,所有,long,牛客,score,solve,2023
From: https://www.cnblogs.com/xjwrr/p/17304625.html