码迷,mamicode.com
首页 > 其他好文 > 详细

CF1011A

时间:2018-07-28 23:26:09      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:cout   head   tle   字母   iostream   tab   lis   存在   stream   

题目链接

题目描述

在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

标签:cout   head   tle   字母   iostream   tab   lis   存在   stream   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!