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

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