hihocoder 分隔相同字符

思路:

枚举,贪心。

在“合法”的前提下放置越排在前边的字母越好。

“合法”:‘a‘ - ‘z‘中没有一个字母的个数超过当前串剩余长度的一半(偶数情况下)或长度的一半加1(奇数情况下)。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 using namespace std;
 5
 6 string s;
 7 int n, cnt[26];
 8
 9 bool check(int x)
10 {
11     for (int i = 0; i < 26; i++)
12     {
13         if (cnt[i] > x / 2 + (x & 1))
14         {
15             return false;
16         }
17     }
18     return true;
19 }
20
21 int main()
22 {
23     cin >> s;
24     n = s.length();
25     int m = n;
26     for (int i = 0; i < n; i++)
27     {
28         cnt[s[i] - ‘a‘]++;
29     }
30     if (!check(n))
31     {
32         puts("INVALID");
33         return 0;
34     }
35     int last = -1;
36     for (int i = 0; i < n; i++)
37     {
38         for (int j = 0; j < 26; j++)
39         {
40             if (cnt[j] && j != last)
41             {
42                 cnt[j]--;
43                 if (check(m - 1))
44                 {
45                     putchar(‘a‘ + j);
46                     last = j;
47                     m--;
48                     break;
49                 }
50                 else
51                     cnt[j]++;
52             }
53         }
54     }
55     puts("");
56     return 0;
57 }
时间: 2024-11-03 22:20:11

hihocoder 分隔相同字符的相关文章

hihocoder1327 分隔相同字符贪心

题意:给出一个字符串进行重新排列,要求相邻的字符串不能相同,问最字典序最小的字符串是什么 题解:贪心,统计一下每一个字符出现的次数,每次取一个不能和前一个字符相等的最小的字符并且剩下的字符要能排列成一个题目要求的字符串 #include <bits/stdc++.h> #define ll long long #define maxn 100100 using namespace std; char s[maxn]; int a[300]; int check(char ch){ if(a[c

hiho一下 第165周#1327 : 分隔相同字符

时间限制:10000ms单点时限:1000ms内存限制:256MB描述给定一个只包含小写字母'a'-'z'的字符串 S ,你需要将 S 中的字符重新排序,使得任意两个相同的字符不连在一起. 如果有多个重排后字符串满足条件,输出字典序最小的一个. 如果不存在满足条件的字符串,输出INVALID. 输入字符串S.(1 ≤ |S| ≤ 100000) 输出输出字典序最小的答案或者INVALID. 样例输入aaabc样例输出abaca c语言代码: #include<stdio.h> #include

css巧妙实现分隔线

单个标签实现分隔线 .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: 200px solid #ddd; border-right: 200px solid #ddd; text-align: center; } 优点:代码简洁 背景色实现分隔线 .demo_line_02{ height: 1px; border-top: 1px solid #ddd; text-align: ce

CSS分隔线

单个标签实现分隔线: .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: 200px solid #ddd; border-right: 200px solid #ddd; text-align: center; } 优点:代码简洁 巧用背景色实现分隔线: .demo_line_02{ height: 1px; border-top: 1px solid #ddd; text-align

CSS巧妙实现分隔线的几种方法

前几天一@同事看新浪微博里有个类似分隔线的提示,就自己试了几种方法来实现这个分隔线.下面就是简单实现分隔线的几种方法,个人比较喜欢第二种,我也给出了最后第五种比较2的写法,请大家拍砖,或者提供其他好的方法. 单个标签实现分隔线: 点此查看实例展示 .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: 200px solid #ddd; border-right: 200px solid #

CSS多种方法实现分隔线

<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <title>CSS实现分隔线的几种方法</title> <style> [url=home.php?mod=space&uid=597245]@charset[/url] "utf-8"; body,h1,h2,h3,h4,p,ul,li,ol,dl,dt,dd,i

字节/字符——输入/输出流

一:1.计算机如何存储中文的? 当前平台默认编码集 :GBK 一个中文两个字节第一个字节:一定是负数第二个字节:一般是负数,可能也会是正数,不会影响的结果.*/public class StringDemo {public static void main(String[] args) {//定义一个字符串// String str = "abc" ;// String str = "我爱你中国" ;String str = "你好" ;//[-

Linux重定向相关(转载帖,供自己cookbook)

Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作.  Linux默认输入是键盘,输出是显示器.你可以用重定向来改变这些设置.比如用wc命令的时候本来是要手动输入一篇文字来计算字符数的,用了重定向后可以直接把一个已经写好的文件用‘<’指向这条命令,就直接可以统计这个文件的字符数等了.输出也是一样,你可以把屏幕输出重定向到一个文件里,再到文件里去看结果.重定向操作符可

Shell 环境变量 &amp; 参数变量

环境变量 $HOME 当前用户的家目录 $PATH 以冒号分隔的用来搜索命令的目录列表 $PS1 命令提示符,通常是$字符,但在bash中,可以使用一些更复杂的值.例如,字符串[\[email protected]\h \w]$就是一个流行的默认值,它给出用户名.机器名和当前目录名,当然也包括一个$提示符. $SP2 二级提示符,用来提示后续的输入,通常是>字符 $IFS 输入域提示符.当shell读取输入时,它给出用来分隔单词的一组字符,它们通常时空格.制表符和换行符 $0 shell脚本的名