Educational Codeforces Round 39 (Rated for Div. 2) 946E E. Largest Beautiful Number
题:
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的更多相关文章
- 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 < ...
- #分组背包 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 ...
- 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 取模也是一样的,就当多减几次. 在欧几里得最初的 ...
- 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 ...
- 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 ...
- 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 ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- 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 ...
随机推荐
- Yii错误异常处理
目录 背景 web错误处理 console错误处理 背景 当程序中出现不可预期的错误,比如说除0异常,yii会给我们扔出这个异常信息,由于现在都是读写分离,客户端调你的api,都是协商好的数据格式,如 ...
- MySQL 新建用户,为用户授权,指定用户访问数据库
1.登录MySQL mysql -u root -p 2.添加新用户(允许所有ip访问) create user 'test'@'*' identified by '123456';(test:用户名 ...
- 【学习笔记】RMQ-Range Minimum/Maximum Query (区间最小/最大值)
RMQ是一类询问区间最小/最大值的问题. 这类问题一般分成两类:静态区间(无修改),动态区间(带修改). 对于动态区间查询最大/最小,我们显然可以用线段树来解决…… 那么对于静态区间查询最大/最小的问 ...
- js实现——鼠标移动时跟随着一连的小图片
首先放置一连的image <body> <div><img src="yezi.png" alt="tu"></div ...
- # VsCode 配置C++调试运行
VsCode 配置C++调试运行 打开命令面板快捷键为F1,软件上写的Ctrl+Shift+P似乎没用 先安装插件使得可以运行 先自行在vsc扩展中搜索C++安装C/C++插件 再参考知乎专栏中安装c ...
- 搭建apache2.4+php7+mysql+phpmyadmin
apache2.2不支持php7,会报错 cannot load php7apache2_4.dll into server 前排提示:保证安装文件夹和我的一致可以省事很多哦 下载地址 下载apach ...
- 使用寄存器点亮LED(第1节)—GPIO功能框图讲解
GPIO简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 ...
- Eclipse一些技巧
1:测试某个测试溢出,修改堆内存大小 // 模拟内存溢出 -Xms10m -Xmx10m private static void mockOOM() { List list = new ArrayLi ...
- 设计Qt风格的C++API
在奇趣(Trolltech),为了改进Qt的开发体验,我们做了大量的研究.这篇文章里,我打算分享一些我们的发现,以及一些我们在设计Qt4时用到的原则,并且展示如何把这些原则应用到你的代码里. 优秀AP ...
- vim编辑器中的替换(转)
转1:https://www.cnblogs.com/david-wei0810/p/6385988.html 转2:https://blog.csdn.net/doubleface999/artic ...