开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情
AcWing 4792. 最大价值
已知,小写字母 a∼z 的价值分别为 wa,wb,…,wz。
对于一个由小写字母构成的长度为 l 的字符串 S=s1s2…sl,其价值为 ws1×1+ws2×2+…+wsl×l。
现在,给定一个由小写字母构成的字符串 S,请你在这个字符串中插入 k 个小写字母,要求最终得到的字符串的价值尽可能大。
注意:
- 插入的位置可以随意选。
- 插入的字母也可以随意选,可以插入不同字母。
输出最大可能价值。
输入格式
第一行包含一个字符串 S。
第二行包含一个整数 k。
第三行包含 26 个整数 wa,wb,…,wz。
输出格式
一个整数,表示最大可能价值。
数据范围
前 33 个测试点满足,S 的长度范围 [1,5]。
所有测试点满足,S 的长度范围 [1,1000],0≤k≤103,wa∼wz 的取值范围 [0,1000]。
输入样例:
abc
3
1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
输出样例:
41
思路
这个题主要的思路就是贪心和构造,因为要构造出最大价值,所以当然想办法选择最大的放在后面就好啦,所以遍历字符串,找出最大的字符,每次都放的是最大的,当然就是最优解啦。接下来就简单了吧,输入所有数据后,按顺序遍历,找出最大的字符,放在原始字符串最后面,然后按题目要求求出最大价值,最后输出出来就行了。
代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define int long long
const int N=2e5+10;
int a[N];
int w[N];
signed main(){
IOS;
string s;
cin>>s;
int k;
cin>>k;
for(int i=1;i<=26;i++)cin>>w[i];
int maxn=0;
char x;
for(int i=1;i<=26;i++){
if(w[i]>=maxn){
maxn=w[i];
x=i+'a'-1;
}
}
while(k--){
s+=x;
}
int sum=0;
for(int i=0;i<s.size();i++){
sum+=w[s[i]-'a'+1]*(i+1);
}
cout<<sum<<endl;
return 0;
}