zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    (原创)如何利用UDP协议封装一个数据包
    <acarousel> 轮播图片无法触屏滑动
    Groovy开发语言
    关于ViewStub标签
    关键字transient和Volatile
    Android中Activity启动模式
    Android 开源项目分类汇总
    AtomicInteger的并发处理
    Cygwin: died waiting for dll loading (转载)
    Android知识点(C2DM)
  • 原文地址:https://www.cnblogs.com/ullio/p/9383760.html
Copyright © 2011-2022 走看看