题目大意:
  给你一个数$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相关推荐

  1. [COCI2015]COCI

    [COCI2015]COCI 题目大意: 有\(n(n\le5\times10^5)\)个人比赛,比赛总共进行\(3\)轮,每一轮得分为\([0,650]\)内的整数.现在已经得知每个人前两轮的成绩. ...

  2. BZOJ3745: [Coci2015]Norma【CDQ】

    3745: [Coci2015]Norma 我们对于a序列分治,枚举左端点(从右往左)维护MINMINMIN和MAXMAXMAX,右端点同时更新两个指针j,k,表示a[mid+1,j]≤MAXa[mi ...

  3. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...

  4. 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 ...

  5. bzoj 3881 [Coci2015]Divljak——LCT维护parent树链并

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3881 对 S 建 SAM ,每个 T 会让 S 的 parent 树的链并答案+1:在 T ...

  6. [Coci2015]Divljak

    题目大意: Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: "1 P",Bob往自己的集合里 ...

  7. bzoj 3745 [Coci2015]Norma——序列分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...

  8. 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 ...

  9. linux chmod命令数字,菜鸟学Linux命令:chmod命令和数字文件权限

    chmod是一条在Unix系统中用于控制用户对文件的权限的命令(change mode单词前缀的组合)和函数. 只有文件所有者和超级用户可以修改文件或目录的权限.可以使用绝对模式,符号模式指定文件的权 ...

最新文章

  1. python re match groups_python re.match与re.search的区别
  2. Hadoop的启动顺序和停止顺序
  3. DELL 通过iDrac安装ESXI
  4. postman添加cookie
  5. python使用mysql
  6. 异常重试_Spring-Retry重试实现原理
  7. js打开本地文件夹_vue + ArcGIS 地图应用系列一:arcgis api本地部署(开发环境)
  8. jenkins maven没有使用全局设置文件地址_Jenkins手把手图文教程「基于Jenkins 2.164.1」...
  9. 操作系统:分享6 个“吓人”的 Linux 命令
  10. Linux文件与目录管理常用命令
  11. .NET应用程序管理服务AMS设计
  12. 机器学习算法——K近邻法
  13. db文件 linux查看工具,Linux最大文件句柄数查看及修改
  14. 50以内的质数顺口溜_【停课不停学】学习妙招|小学数学学习中的顺口溜,记住了事半功倍!...
  15. Spring AOP之静态代理
  16. 8m照片宽和高是多少_8寸照片的大小
  17. LED背光源技术特点
  18. IDE, virtio, virtio-scsi 硬盘区别
  19. 终于解决“Git Windows客户端保存用户名与密码”的问题zhz
  20. js unshift性能分析

热门文章

  1. 求中位数中回文数之和C语言,一些算法题及答案
  2. java jai create 方法_使用JAI扩展Java Image的功能
  3. 李宏毅机器学习课程-Structured Learning
  4. Anaconda3自带jupyter
  5. 高并发大流量专题---6、独立图片服务器的部署
  6. 教你简单理解分布式与传统单体架构的区别
  7. for each....in、for in、for of
  8. window screen (获取屏幕信息)
  9. 用js做分页,点击下一页时,直接跳到了最后一页——Number()的妙用
  10. DataGridView控件初始化,添加删除行(不绑定数据库)