题:

  OvO http://codeforces.com/contest/946/problem/E

  CF 946E 

解:

  记读入串为 s ,答案串为 ans,记读入串长度为 len,下标从 1 开始。

  分三种情况讨论

  1.数字位数为奇数,设数字位数为 len,则输出 ( len-1 ) 个 9 即可

  2.数字位数为偶数,其中最高位为,最低位为 或者,其他位为 ,(即 100001,100 这些形式),记数字位数为 len,则输出 ( len-2 ) 个 9 即可

  3.数字位数为偶数,而并非是第二种情况,那么进行一次 dfs 即可

    dfs 中,记处理到第 id 位,进行如下两种情况的匹配

    1.ans[id] = s[id],此时要继续进行为 id+1 位的dfs。

    2.ans[id] < s[id],此时在区间 [0,s[id]-1] 中从大到小寻找合适值,如果找到,那么答案串的 1~id 位已经确定, 而余下的 id+1~len 位可以从前面推导得到,所以不用继续进行 dfs。

dfs部分代码如下(预处理中我已经将读入串s整体值减一)

bool dfs(int id)
{
if(id==len+1) return true;
bool flag;
int pi,now=s[id];
//1
if(cnt[now])
cnt[now]--,ned--,ans[id]=now;
else
cnt[now]++,ned++,ans[id]=now;
if(ned<=len-id+1)
{
flag=dfs(id+1);
if(flag) return true;
}
if(cnt[now])
cnt[now]--,ned--,ans[id]=-1;
else
cnt[now]++,ned++,ans[id]=-1;
//2
while(now-1>=0)
{
now--;
if(cnt[now])
cnt[now]--,ned--,ans[id]=now;
else
cnt[now]++,ned++,ans[id]=now;
if(ned<=len-id+1)
return true;
if(cnt[now])
cnt[now]--,ned--,ans[id]=-1;
else
cnt[now]++,ned++,ans[id]=-1;
}
return false;
}

好♂用的数据

7
89
88
1000
28923845
340011
1001 88
77
99
28923839
339933
99

  

全部代码:

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio> using namespace std; const int M=2e5+44;
const int N=14; char str[M];
int s[M],len;
int cnt[N],ned;
int ans[M]; void fillAns()
{
int pi=len;
for(int i=0;i<=9;i++)
while(cnt[i]--)
ans[pi--]=i;
while(ans[pi]==-1)
ans[pi]=9,pi--;
} bool dfs(int id)
{
if(id==len+1) return true;
bool flag;
int pi,now=s[id];
//1
if(cnt[now])
cnt[now]--,ned--,ans[id]=now;
else
cnt[now]++,ned++,ans[id]=now;
if(ned<=len-id+1)
{
flag=dfs(id+1);
if(flag) return true;
}
if(cnt[now])
cnt[now]--,ned--,ans[id]=-1;
else
cnt[now]++,ned++,ans[id]=-1;
//2
while(now-1>=0)
{
now--;
if(cnt[now])
cnt[now]--,ned--,ans[id]=now;
else
cnt[now]++,ned++,ans[id]=now;
if(ned<=len-id+1)
return true;
if(cnt[now])
cnt[now]--,ned--,ans[id]=-1;
else
cnt[now]++,ned++,ans[id]=-1;
}
return false;
} void solve()
{
memset(cnt,0,sizeof(cnt)); ned=0;
memset(ans,-1,sizeof(int)*(len+22));
dfs(1);
fillAns();
for(int i=1;i<=len;i++)
printf("%d",ans[i]);
puts("");
} int main()
{
int ex0,ex1;
int cas;
scanf("%d",&cas);
for(int icas=1;icas<=cas;icas++)
{
scanf("%s",str+1);
len=strlen(str+1);
for(int i=1;i<=len;i++)
s[i]=str[i]-'0';
int pi=len;
s[pi]--;
while(s[pi]<0)
{
s[pi]+=10;
pi--; s[pi]--;
}
ex0=ex1=0;
for(int i=1;i<=len;i++)
if(s[i]==0) ex0++;
else if(s[i]==1) ex1++;
if(s[1]==0 || (ex0+ex1==len && ex1==1))
{
for(int i=1;i<=len-2;i++)
printf("9");
puts("");
}
else if(len&1)
{
for(int i=1;i<=len-1;i++)
printf("9");
puts("");
}
else
solve();
}
return 0;
} /* 7
89
88
1000
28923845
340011
1001 88
77
99
28923839
339933
99 */

  

Educational Codeforces Round 39 (Rated for Div. 2) 946E E. Largest Beautiful Number的更多相关文章

  1. Educational Codeforces Round 39 (Rated for Div. 2) G

    Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...

  2. #分组背包 Educational Codeforces Round 39 (Rated for Div. 2) D. Timetable

    2018-03-11 http://codeforces.com/contest/946/problem/D D. Timetable time limit per test 2 seconds me ...

  3. Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]

    https://zh.wikipedia.org/wiki/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95 取模也是一样的,就当多减几次. 在欧几里得最初的 ...

  4. codeforces Educational Codeforces Round 39 (Rated for Div. 2) D

    D. Timetable time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  5. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  6. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  7. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  8. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  9. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

随机推荐

  1. ubuntu18和windows10双系统时间不同步问题(Ubuntu)

    1.安装并校准时间 sudo apt install ntpdate sudo ntpdate time.windows.com 2.写入硬件配置 sudo hwclock --localtime - ...

  2. GB2312 字符集

    <信息交换用汉字编码字符集>是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980. GB2312编码适用于汉字处理.汉字通信等系统 ...

  3. docker 的常用命令汇总

  4. IntelliJ Idea基于Maven创建SpringMVC程序

    1. 创建Maven工程 网上很多资料,不再详细介绍,请参看IntelliJ IDEA 创建 hello world Java web Maven项目从头到尾都有图有真相2017版本 有关settin ...

  5. Codeforces 1249 D2. Too Many Segments (hard version)

    传送门 贪心 对于第一个不合法的位置,我们显然要通过删除几个覆盖了它的区间来使这个位置合法 显然删右端点更靠右的区间是更优的,所以就考虑优先删右端点靠右的,然后再考虑下一个不合法位置 用一个 $set ...

  6. 设置阿里云镜像仓库并安装Docker

    echo "设置阿里云镜像仓库" mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum ...

  7. 解决GitHub下载速度缓慢的问题

    随着微软大大宣布GitHub针对个人用户的仓库免费,相信每位开发者都感受到了"真香". 然而因为一些众所周知的原因,国内访问GitHub总会遇到下载速度缓慢.链接意外终止的情况. ...

  8. (一)shiro简介和用户登录demo及角色管理

    一.shiro简介 Apache Shiro是Java的一个安全框架.Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境.Shiro可以帮助我们完成 ...

  9. Java CountingSort

    Java CountingSort /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternation ...

  10. Bminer

    Bminer https://www.bminer.me/zh/ Bminer: When Crypto-mining Made Fast¶ Bminer是一款为NVIDIA和AMD GPU深度优化的 ...