\(给定一串字母,分成k份,使得最大字典序最小。(字母可以任意组合)\)

\(------------------------------issue~------------------------\)

\(首先肯定先对字母排序,然后往k个盒子都丢一个字母(因为不能为空)\)

\(那么接下来,就一定能够要想清楚了......\)

\(\color{Red}Ⅰ.当接下来的字母都相等时,就均分到k个盒子里,因为这时候影响字典序的只是长度\)

\(\color{Purple}{Ⅱ.当接下来的字母不全相等,意味着什么?还能均分吗?}\)

\(问题的关键在于,接下去总会有不相等的字母,每次均分的话迟早轮到某个盒子分到的是较大的字母\)

\(那这样一定不会比我把所有字母接在第一个盒子更优,因为虽然我的长度长,但是相同位置上一定是最小的!!(字母已经排序了)\)

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+9;
char s[maxn];
string a[maxn],maxx;
int t,n,k,y,L;
void work()
{
for(int i=1;i<=k;i++)
a[i]+=s[++y];
}
int main()
{
cin>>t;
while(t--)
{
int flag=0;
for(int i=1;i<=100000;i++) a[i]="";
cin>>n>>k>>(s+1);
sort(s+1,s+1+strlen(s+1));
L=strlen(s+1);
for(int i=1;i<=k;i++)
a[i]+=s[i];//先都分一个字典序最小的
if(a[k]!=a[1]) cout<<a[k];//最大一定是a[k];
else
{
int flag=1;
for(int i=k+2;i<=L;i++) if(s[i]!=s[i-1]) flag=0;
if(flag)//都相等
{
y=k;
while(y<n) work();
cout<<a[1];
}
else//不都相等
{
for(int i=k+1;i<=L;i++) a[1]+=s[i];
cout<<a[1];
}
}
cout<<endl;
}
}

最新文章

  1. spring3 循环依赖
  2. Palindrome Pairs
  3. jquery的工具方法isFunction/isArray/isWindow/isNumeric/isPlainObject/isEmptyObject
  4. RCNN--对象检测的又一伟大跨越
  5. My first Scratch small game
  6. Android Java 自定义异常
  7. mysql快速上手2
  8. Java常见知识问答
  9. CSS实现侧边栏固定宽度,内容栏自适应
  10. MYSQL 表分区的 3 方法
  11. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )
  12. final对于访问效率的影响
  13. HTML5拖放事件-上传图片预览功能
  14. lucene构建同义词分词器
  15. java日志框架log4j详细配置及与slf4j联合使用教程
  16. MQTT服务器的搭建(Windows平台)
  17. flink 读取kafka 数据,partition分配
  18. php-resque 轻量级队列
  19. asp.net mvc &amp;&amp; asp.net 页面跳转
  20. python open函数的坑

热门文章

  1. [转] Roguelike开发建议
  2. CTR学习笔记&amp;代码实现3-深度ctr模型 FNN-&gt;PNN-&gt;DeepFM
  3. 哈密顿绕行世界问题 HDU2181
  4. F. 蚂蚁装修
  5. [V&amp;N2020 公开赛]TimeTravel 复现
  6. 永恒之蓝MS17010复现
  7. java第八周课后作业
  8. 使用User Agent和代理IP隐藏身份
  9. Java中集合概念
  10. php下载各种编辑器输出的内容到word中展示