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;
}

猜你喜欢

转载自www.cnblogs.com/ullio/p/9383760.html
cf