首页 > 其他 > 详细

CF1011A

时间:2018-07-28 23:20:02      阅读:194      评论:0      收藏:0      [点我收藏+]

题目链接

题目描述

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

CF1011A

原文:https://www.cnblogs.com/ullio/p/9383760.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!