CF1011A
题目链接
题目描述
在N个字母中选择K个,只能选择大于上一个选择的字母的分值+1的字母,问最大的分值是多少.
无解请输出-1.
(a分值为1,z分值为26)
输入输出格式
输入格式:
第一行n,k
第二行一行字符串,保证只有小写字母
输出格式:
一个整数,表示最大分值
样例
输入样例 | 输出样例 |
---|---|
5 3 xyabd | 29 |
7 4 problem | 34 |
2 2 ab | -1 |
12 1 abaabbaaabbb | 1 |
思路
1.贪心
首先,应该能想到每个字母最多只能选一次
那么我们用一个bool数组表示每个字母是否存在
考虑存在的字母是连续的一段的情况
直接贪心从第一个存在的字母开始取
一定有 (长度+1)/2>=长度/2
考虑存在的字母不是连续一段的情况
因为取的字母要间隔一格
所以不连续的一段可以拆成互相独立的连续子段
整体最大分值就是子段最大分值的和
贪心策略成立
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <map>
#define ll long long
#define ull unsigned long long
#define ci const int&
#define cl const long long&
#define cul const undigned long long&
#define io_f std::ios::sync_with_stdio(false)
using namespace std;
bool mp[30];
int n,m;
int main() {
char a;
io_f;
cin>>n>>m;
for(int i=1;i<=n;i++) {
cin>>a;
mp[a-'a'+1]=1;
}
int ans=0;
for(int i=1;i<=26&&m;i++) {
if(mp[i]) {
m--;
ans+=i;
i++;
}
}
if(!m)cout<<ans;
else cout<<-1;
return 0;
}