埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 I题 二数
题目链接https://www.nowcoder.com/acm/contest/91/I
思路:从左往右扫,发现第一个奇数,要特判第一个为9的情况。然后比第一个奇数大的让其后面的奇数全为0;比第一个奇数小的让其后面全为8。
判断原来的数后面是否大于444.....444。如果大于那么就选第一个数,否则选第二个数。
1 /*
2 代码写丑了
3 */
4 #include<iostream>
5 #include<string>
6 #include<string.h>
7 #include<algorithm>
8 #include<stdio.h>
9 using namespace std;
10 bool cmp(string a,int num){
11 for(int i=num;i<a.length();i++){
12 if(a[i]=='4'){
13 continue;
14 }else if(a[i]>'4'){
15 return false;
16 }else{
17 return true;
18 }
19 }
20 return true;
21 }
22 int main(){
23 int n;
24 cin>>n;
25 while(n--){
26 string a;
27 cin>> a;
28 char ans1[100500];
29 memset(ans1,0,sizeof(ans1));
30 char ans2[100500];
31 memset(ans2,0,sizeof(ans2));
32 int flag=0;
33 for(int j=0;j<a.length();j++){
34 if(flag==0&&a[j]=='9'){
35 flag=1;
36 for(int i=j;i<a.length();i++){
37 if(a[i]=='9'){
38 ans1[i]='8';
39 }else if((a[i]-'0')%2){
40 ans1[i]='8';
41 }else{
42 ans1[i]='8';
43 }
44 }
45 int t=0;
46 for(int i=0;i<strlen(ans1);i++){
47 if(t==0&&i<strlen(ans1)-1&&ans1[i]=='0'){
48 continue;
49 }else{
50 t=1;
51 cout<<ans1[i];
52 }
53 }
54 cout<<endl;
55 break;
56 }else if(flag==0&&(a[j]-'0')%2){
57 flag=1;
58 ans1[j]=char(a[j]-1);
59 ans2[j]=char(a[j]+1);
60 for(int i=j+1;i<a.length();i++){
61 if(a[i]=='9'){
62 ans1[i]='8';
63 ans2[i]='0';
64 }else if((a[i]-'0')%2){
65 ans1[i]='8';
66 ans2[i]='0';
67 }else{
68 ans1[i]='8';
69 ans2[i]='0';
70 }
71 }
72 bool fg=cmp(a,j+1);
73 int t=0;
74 if(fg){
75 for(int i=0;i<strlen(ans1);i++){
76 if(t==0&&i<strlen(ans1)-1&&ans1[i]=='0'){
77 continue;
78 }else{
79 t=1;
80 cout<<ans1[i];
81 }
82 }
83 cout<<endl;
84 }else{
85 for(int i=0;i<strlen(ans2);i++){
86 if(t==0&&i<strlen(ans2)-1&&ans2[i]=='0'){
87 continue;
88 }else{
89 t=1;
90 cout<<ans2[i];
91 }
92 }
93 cout<<endl;
94 }
95 break;
96 }else{
97 ans1[j]=a[j];
98 ans2[j]=a[j];
99 }
100 }
101 if(flag==0){
102 for(int i=0;i<a.length();i++){
103 cout<<a[i];
104 }
105 cout<<endl;
106 }
107 }
108 return 0;
109 }