每日一题 — 2020 - 05 - 02

38 篇文章 0 订阅
15 篇文章 0 订阅

题目链接

表示又不会,又学到知识了,最近又越来越菜了

思路推理:

  • 首先是贪心思维题吧,首先主要把题目意思理解清楚
  • 首先分为 3 种情况,首先需要排序
  • 首先第一种,我们要分成 k 组,那么我们就找前k个字母,这里我们将他存入set里,如果他的数目 >= 2,那么我们输出 弟k - 1就OK,这是k = 2的情况,其他的也符合,多想一下
    在这里插入图片描述
  • 然后是第二种情况,第二种情况,就是前面的值都相同,那么我们要判断后面的,如果后面的存在不相同的,那么我们就输出k - 1 个字符 + 后面全部的
    在这里插入图片描述
  • 第三种就是前k个相同,后面的也都相同,那么我们求出后面的个数对k的取模,那么进行计算输出
    在这里插入图片描述
  • 最后如果有k个字符(n),那么输出最后一个就可以

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>

using namespace std;

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n, k;
		scanf("%d%d",&n,&k);
		string s;
		cin>>s;
		sort(s.begin(),s.end());
		set <char> s1, s2;
		for (int i = 0; i < k; i++){
			s1.insert(s[i]);
		}
		if (s1.size() >= 2){
			printf("%c\n",s[k - 1]);
			continue;
		}
		else{
			for (int i = k; i < n; i ++){
				s2.insert(s[i]);
			}
			if (s2.size() >= 2){
				printf("%c",s[k - 1]);
				for (int i = k; i < n; i++){
					printf("%c",s[i]);
				}
				puts("");
				continue;
			}
			else if (s2.size() == 1){
				int x;
				if ((n - k) % k != 0){
					x = (n - k) / k + 1;
				}
				else{
					x = (n - k) / k;
				}
				printf("%c",s[k - 1]);
				for (int i = 1; i <= x; i++){
					printf("%c",s[k]);
				}
				puts("");
			}
			else{
				printf("%c\n",s[k - 1]);
			}
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值