题目分析:点击查看

题目大意:给出一个字符串 s 以及 k 个集合,要求将字符串 s 中的字符分配到 k 个集合中,使得:

  1. k 个集合都是非空集合
  2. k 个集合中字典序最大的字符串最小

输出这个字典序最大的字符串

题目分析:吐了。。本来以为是贪心,想了好久的贪心策略结果还是一筹莫展,补题的时候发现就是一个分类讨论,我:???

如果单纯的分析这个题目,其实是不太好入手的,之所以可以放在 C 题的位置,是因为样例的提示已经非常尽职尽责了,一共就三种情况,样例全都囊括了,换句话说,只要过了样例,差不多就能 AC 了

首先贪心对字符串 s 排序,不难看出第一步肯定是需要将前 k 个字符分别放入 k 个集合中,然后分三种情况:

  1. 如果前 k 个字符都相同

    1. 如果剩下的 n - k 个字符都相同,则均匀分配到每个集合中即可,对应着样例 1 和样例 4
    2. 如果剩下的 n - k 个字符存在不同,则将剩下 n - k 个字符放在目前字典序最小的字符后面最优,对应着样例 2 和样例 6
  2. 如果前 k 个字符存在不同:答案是字典序最大的字符(只有单个字符),对应着样例 3 和样例 5

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;bool check_same(string s)
{for(int i=0;i<s.size()-1;i++)if(s[i]!=s[i+1])return false;return true;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n,k;string s;cin>>n>>k>>s;sort(s.begin(),s.end());if(s[0]!=s[k-1])cout<<s[k-1]<<endl;else{if(check_same(s.substr(k)))cout<<s[0]+string((n-1)/k,s[k])<<endl;elsecout<<s[0]+s.substr(k)<<endl;}}return 0;
}

CodeForces - 1348C Phoenix and Distribution(思维)相关推荐

  1. Codeforces 1077B Disturbed People(思维题)

    Codeforces 1077B Disturbed People(思维题) There is a house with nn flats situated on the main street of ...

  2. Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x ...

  3. Codeforces Round #410 (Div. 2) D. Mike and distribution 思维+数学

    链接: http://codeforces.com/contest/798/problem/D 题意: 给你两个长度为n的数列a和b,让你选n/2+1个下标,使得2*∑ai>suma,2*∑bi ...

  4. CodeForces - 798D Mike and distribution(构造+思维/玄学随机数)

    题目链接:点击查看 题目大意:给出两个长度为n的数列,现在要求选出n/2+1个位置,使得两个序列中这些位置的和分别大于各自序列之和的一半 题目分析:题意换句话说,是需要让我们从数组中选出一半,要大于另 ...

  5. Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp

    传送门 文章目录 题意: 思路: 题意: 有nnn台电脑,你可以手动打开某个电脑,如果第i−1,i+1i-1,i+1i−1,i+1台电脑都打开了,那么第iii台电脑会自动打开.不能手动打开自动打开的电 ...

  6. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  7. Codeforces 846 A Curriculum Vitae 思维 暴力

    题目链接: http://codeforces.com/contest/846/problem/A 题目描述: 给你一个串, 你可以做删除操作, 要求结果串0不能在1的右边, 问最多可以剩几个数字 解 ...

  8. Codeforces 861 B Which floor? 思维

    题目链接: http://codeforces.com/contest/861/problem/B 题目描述: 每个楼梯上有相同数量的数, 都是从1开始, 给你m个不矛盾的信息, 问你能不能判断n在第 ...

  9. Codeforces 798D Mike and distribution (构造)

    题目链接 http://codeforces.com/contest/798/problem/D 题解 前几天的模拟赛,居然出这种智商题..被打爆了QAQ 这个的话,考虑只有一个序列怎么做,把所有的排 ...

最新文章

  1. 什么是维度诅咒?如何评估降维算法在当前任务数据集上的效果?
  2. I2C死锁原因及解决方法
  3. 深度学习核心技术精讲100篇(十四)-一文带你看懂GPflow的前世今生
  4. Qt for ios 无证书真机调试
  5. 网络生成批量配置_GitHub Star 3.2K Java 图片缩略图生成库
  6. android编程读取sd卡txt文件,如何读取SD卡中的txt文件?
  7. 什么是泛型、为什么要使用以及泛型擦除
  8. CentOS6网卡静态IP设置
  9. 换一种方式“写代码 编程序“,为自己的程序生涯找条新路
  10. js 按给定数组的顺序给数组排序_JavaScript中如何如何给数组以及数组对象根据value值进行排序。...
  11. 关于perl中中文乱码的解决办法
  12. mysql 5.7.26安装教程
  13. go加解密系列——AES加解密
  14. CCF 201903-1 小中大
  15. 平均增长率不用计算机,【程阳解答】如何用计算器或Excel计算年均增长率?
  16. 圣诞礼物送什么 荣耀畅玩5为你排忧解难
  17. 瞧不起,与 “瞧不起”
  18. grep -rn搜索服务配置文件信息、log字段信息
  19. python中的copy()与deepcopy()
  20. Java下载安装及配置

热门文章

  1. java表达式语法格式为_2009(选修)JavaWeb模拟试卷(2011-2012)
  2. ConcurrentHashMap的源码分析-tryPresize
  3. 数据采集提升性能篇-使用Mybatis的批量操作api导入数据
  4. toString和newString的原理
  5. 缓存-SpringCache-原理与不足
  6. 引导类、扩展类、系统类加载器的使用及演示
  7. request域对象和请求转发
  8. 利用solr实现商品的搜索功能
  9. 初始化方法-创建对象时自动调用初始化方法
  10. c语言仓库管理系统链表,仓库管理系统 C语言 C++ 数据结构 链表 课程设计