CodeForces - 1348C Phoenix and Distribution(思维)
题目分析:点击查看
题目大意:给出一个字符串 s 以及 k 个集合,要求将字符串 s 中的字符分配到 k 个集合中,使得:
- k 个集合都是非空集合
- k 个集合中字典序最大的字符串最小
输出这个字典序最大的字符串
题目分析:吐了。。本来以为是贪心,想了好久的贪心策略结果还是一筹莫展,补题的时候发现就是一个分类讨论,我:???
如果单纯的分析这个题目,其实是不太好入手的,之所以可以放在 C 题的位置,是因为样例的提示已经非常尽职尽责了,一共就三种情况,样例全都囊括了,换句话说,只要过了样例,差不多就能 AC 了
首先贪心对字符串 s 排序,不难看出第一步肯定是需要将前 k 个字符分别放入 k 个集合中,然后分三种情况:
- 如果前 k 个字符都相同
- 如果剩下的 n - k 个字符都相同,则均匀分配到每个集合中即可,对应着样例 1 和样例 4
- 如果剩下的 n - k 个字符存在不同,则将剩下 n - k 个字符放在目前字典序最小的字符后面最优,对应着样例 2 和样例 6
- 如果前 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(思维)相关推荐
- Codeforces 1077B Disturbed People(思维题)
Codeforces 1077B Disturbed People(思维题) There is a house with nn flats situated on the main street of ...
- Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集
传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau+av≥x ...
- 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 ...
- CodeForces - 798D Mike and distribution(构造+思维/玄学随机数)
题目链接:点击查看 题目大意:给出两个长度为n的数列,现在要求选出n/2+1个位置,使得两个序列中这些位置的和分别大于各自序列之和的一半 题目分析:题意换句话说,是需要让我们从数组中选出一半,要大于另 ...
- Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp
传送门 文章目录 题意: 思路: 题意: 有nnn台电脑,你可以手动打开某个电脑,如果第i−1,i+1i-1,i+1i−1,i+1台电脑都打开了,那么第iii台电脑会自动打开.不能手动打开自动打开的电 ...
- CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)
题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...
- Codeforces 846 A Curriculum Vitae 思维 暴力
题目链接: http://codeforces.com/contest/846/problem/A 题目描述: 给你一个串, 你可以做删除操作, 要求结果串0不能在1的右边, 问最多可以剩几个数字 解 ...
- Codeforces 861 B Which floor? 思维
题目链接: http://codeforces.com/contest/861/problem/B 题目描述: 每个楼梯上有相同数量的数, 都是从1开始, 给你m个不矛盾的信息, 问你能不能判断n在第 ...
- Codeforces 798D Mike and distribution (构造)
题目链接 http://codeforces.com/contest/798/problem/D 题解 前几天的模拟赛,居然出这种智商题..被打爆了QAQ 这个的话,考虑只有一个序列怎么做,把所有的排 ...
最新文章
- 什么是维度诅咒?如何评估降维算法在当前任务数据集上的效果?
- I2C死锁原因及解决方法
- 深度学习核心技术精讲100篇(十四)-一文带你看懂GPflow的前世今生
- Qt for ios 无证书真机调试
- 网络生成批量配置_GitHub Star 3.2K Java 图片缩略图生成库
- android编程读取sd卡txt文件,如何读取SD卡中的txt文件?
- 什么是泛型、为什么要使用以及泛型擦除
- CentOS6网卡静态IP设置
- 换一种方式“写代码 编程序“,为自己的程序生涯找条新路
- js 按给定数组的顺序给数组排序_JavaScript中如何如何给数组以及数组对象根据value值进行排序。...
- 关于perl中中文乱码的解决办法
- mysql 5.7.26安装教程
- go加解密系列——AES加解密
- CCF 201903-1 小中大
- 平均增长率不用计算机,【程阳解答】如何用计算器或Excel计算年均增长率?
- 圣诞礼物送什么 荣耀畅玩5为你排忧解难
- 瞧不起,与 “瞧不起”
- grep -rn搜索服务配置文件信息、log字段信息
- python中的copy()与deepcopy()
- Java下载安装及配置
热门文章
- java表达式语法格式为_2009(选修)JavaWeb模拟试卷(2011-2012)
- ConcurrentHashMap的源码分析-tryPresize
- 数据采集提升性能篇-使用Mybatis的批量操作api导入数据
- toString和newString的原理
- 缓存-SpringCache-原理与不足
- 引导类、扩展类、系统类加载器的使用及演示
- request域对象和请求转发
- 利用solr实现商品的搜索功能
- 初始化方法-创建对象时自动调用初始化方法
- c语言仓库管理系统链表,仓库管理系统 C语言 C++ 数据结构 链表 课程设计