每日一題 — 2020 - 05 - 02

題目鏈接

表示又不會,又學到知識了,最近又越來越菜了

思路推理:

  • 首先是貪心思維題吧,首先主要把題目意思理解清楚
  • 首先分爲 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章