[COCI2015]ZGODAN
题目大意:
给你一个数$n(n\leq10^1000)$,定义一个数是“美丽数”当且仅当这个数各个数位上的数奇偶性不同。
求最接近$n$的“美丽数”,若有多个,则依次输出。
思路:
贪心+高精度。
首先找出$n$的第一个不符合要求的数位,从这一位开始贪心。
后面几位要么是'8''9'交替(小于$n$的最大的“美丽数”),要么是'0''1'交替(大于$n$的最小的“美丽数”)。
然后高精度减法减一下,比较哪个更接近即可。
1 #include<cstdio> 2 #include<cstring> 3 const int LEN=1002; 4 char s[LEN],a[LEN],b[LEN],c[LEN],d[LEN],tmp[LEN]; 5 int len; 6 inline void treat(char s[]) { 7 for(register int i=0;i<len;i++) { 8 s[i]^='0'; 9 } 10 } 11 int main() { 12 gets(s); 13 len=strlen(s); 14 treat(s); 15 a[0]=b[0]=s[0]; 16 for(register int i=1;i<len;i++) { 17 if((s[i-1]&1)^(s[i]&1)) { 18 a[i]=b[i]=s[i]; 19 } else { 20 if(s[i]!=0) { 21 a[i]=s[i]-1; 22 for(register int j=i+1;j<len;j++) { 23 a[j]=a[j-1]&1?8:9; 24 } 25 } 26 if(s[i]!=9) { 27 b[i]=s[i]+1; 28 for(register int j=i+1;j<len;j++) { 29 b[j]=b[j-1]&1?0:1; 30 } 31 } 32 if(s[i]==0) { 33 treat(b); 34 puts(b); 35 return 0; 36 } 37 if(s[i]==9) { 38 treat(a); 39 puts(a); 40 return 0; 41 } 42 for(register int j=len-1;j>=i;j--) { 43 tmp[j]=s[j]; 44 } 45 for(register int j=len-1;j>=i;j--) { 46 if((signed char)tmp[j]<0) { 47 tmp[j]+=10; 48 tmp[j-1]--; 49 } 50 c[j]+=tmp[j]-a[j]; 51 if((signed char)c[j]<0) { 52 c[j]+=10; 53 tmp[j-1]--; 54 } 55 } 56 for(register int j=len-1;j>=i;j--) { 57 tmp[j]=b[j]; 58 } 59 for(register int j=len-1;j>=i;j--) { 60 if((signed char)tmp[j]<0) { 61 tmp[j]+=10; 62 tmp[j-1]--; 63 } 64 d[j]+=tmp[j]-s[j]; 65 if((signed char)d[j]<0) { 66 d[j]+=10; 67 tmp[j-1]--; 68 } 69 } 70 treat(a); 71 treat(b); 72 for(register int j=i;j<len;j++) { 73 if(c[j]<d[j]) { 74 puts(a); 75 return 0; 76 } 77 if(c[j]>d[j]) { 78 puts(b); 79 return 0; 80 } 81 } 82 printf("%s %s\n",a,b); 83 return 0; 84 } 85 } 86 return 0; 87 }
转载于:https://www.cnblogs.com/skylee03/p/8420960.html
[COCI2015]ZGODAN相关推荐
- [COCI2015]COCI
[COCI2015]COCI 题目大意: 有\(n(n\le5\times10^5)\)个人比赛,比赛总共进行\(3\)轮,每一轮得分为\([0,650]\)内的整数.现在已经得知每个人前两轮的成绩. ...
- BZOJ3745: [Coci2015]Norma【CDQ】
3745: [Coci2015]Norma 我们对于a序列分治,枚举左端点(从右往左)维护MINMINMIN和MAXMAXMAX,右端点同时更新两个指针j,k,表示a[mid+1,j]≤MAXa[mi ...
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...
- BZOJ 3745: [Coci2015]Norma(分治)
题意 给定一个正整数序列 \(a_1, a_2, \cdots, a_n\) ,求 \[ \sum_{i=1}^{n} \sum_{j=i}^{n} (j - i + 1) \min(a_i,a_{i ...
- bzoj 3881 [Coci2015]Divljak——LCT维护parent树链并
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3881 对 S 建 SAM ,每个 T 会让 S 的 parent 树的链并答案+1:在 T ...
- [Coci2015]Divljak
题目大意: Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: "1 P",Bob往自己的集合里 ...
- bzoj 3745 [Coci2015]Norma——序列分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...
- PKUSC2018训练日程(4.18~5.30)
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...
- linux chmod命令数字,菜鸟学Linux命令:chmod命令和数字文件权限
chmod是一条在Unix系统中用于控制用户对文件的权限的命令(change mode单词前缀的组合)和函数. 只有文件所有者和超级用户可以修改文件或目录的权限.可以使用绝对模式,符号模式指定文件的权 ...
最新文章
- python re match groups_python re.match与re.search的区别
- Hadoop的启动顺序和停止顺序
- DELL 通过iDrac安装ESXI
- postman添加cookie
- python使用mysql
- 异常重试_Spring-Retry重试实现原理
- js打开本地文件夹_vue + ArcGIS 地图应用系列一:arcgis api本地部署(开发环境)
- jenkins maven没有使用全局设置文件地址_Jenkins手把手图文教程「基于Jenkins 2.164.1」...
- 操作系统:分享6 个“吓人”的 Linux 命令
- Linux文件与目录管理常用命令
- .NET应用程序管理服务AMS设计
- 机器学习算法——K近邻法
- db文件 linux查看工具,Linux最大文件句柄数查看及修改
- 50以内的质数顺口溜_【停课不停学】学习妙招|小学数学学习中的顺口溜,记住了事半功倍!...
- Spring AOP之静态代理
- 8m照片宽和高是多少_8寸照片的大小
- LED背光源技术特点
- IDE, virtio, virtio-scsi 硬盘区别
- 终于解决“Git Windows客户端保存用户名与密码”的问题zhz
- js unshift性能分析
热门文章
- 求中位数中回文数之和C语言,一些算法题及答案
- java jai create 方法_使用JAI扩展Java Image的功能
- 李宏毅机器学习课程-Structured Learning
- Anaconda3自带jupyter
- 高并发大流量专题---6、独立图片服务器的部署
- 教你简单理解分布式与传统单体架构的区别
- for each....in、for in、for of
- window screen (获取屏幕信息)
- 用js做分页,点击下一页时,直接跳到了最后一页——Number()的妙用
- DataGridView控件初始化,添加删除行(不绑定数据库)