AcWing 4792. 最大价值「掘金日新计划 · 2 月更文挑战」

88 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}