原题链接:
http://codeforces.com/problemset/problem/770/B
题意:
给你一个正整数n,求1-n中位数和最大的(若有相等的取原值最大的);
思路:
这里简单思考一下:
位数和最大-->在各个位中出现9的次数越多位数和越大;
(1)最高位减1,其余位9填充;
记录一下每位的变化情况(用sum1),比如:最高位减1的,变化情况位-1;9填充的位;变化情况位9减该位数值(最后记录下变化总和);
原值最大的-->减1的那个位越低越好;
(2)最高位不动,从次高位开始找第一个小于9的位减1,其余位9填充;
记录一下每位的变化情况(用sum2)
最后判断sum1,sum2和0的关系;
(3)sum1,sum2都为0是可认为原值不进行改变就满足(1),(2)情况;
sum1>sum2时(1)情况是最佳方式;
sum1<=sum2时(2)情况是最佳的;
代码:
1 #include<cstdio> 2 #include<string> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 7 using namespace std; 8 9 int main() 10 { 11 string s; 12 int a[20],b[20],c[20],sum1=0,sum2=0,d=0;//b[],sum1是用来记录(1)情况的;c[],sum2记录(2)情况的; 13 int i,x,y=0,flag1=0,flag2=0; 14 cin>>s; 15 for(i=0;i<s.length();i++) 16 { 17 a[i]=s[i]-'0'; 18 } 19 for(i=0;i<s.length();i++) //(1)情况 20 { 21 if(i==0) 22 b[i]=-1; 23 else 24 b[i]=9-a[i]; 25 sum1+=b[i]; 26 } 27 for(i=1;i<s.length();i++) //(2)情况 28 { 29 if(a[i]!=9&&!flag1) //找到第一个小于9的位 30 { 31 y=i-1; 32 flag1=1; 33 } 34 if(flag1) 35 { 36 if(i==y+1) 37 { 38 c[d++]=-1; 39 sum2+=c[d-1]; 40 // printf("c[%d]=%d\n",d-1,c[d-1]); 41 } 42 c[d++]=9-a[i]; 43 sum2+=c[d-1]; 44 // printf("c[%d]=%d\n",d-1,c[d-1]); 45 } 46 } 47 // printf("sum1=%d,sum2=%d\n",sum1,sum2); 48 if(sum1<=0&&sum2<=0) //判断 当sum1,sum2与0的关系 49 x=s.length(); 50 else if(sum1>sum2) 51 x=0; 52 else if(sum1<=sum2) 53 x=y; 54 for(i=x;i<s.length();i++) 55 { 56 if(i==x) 57 a[i]--; 58 else 59 a[i]=9; 60 } 61 for(i=0;i<s.length();i++) 62 { 63 if(a[i]!=0) 64 flag2=1; 65 if(flag2) 66 cout<<a[i]; 67 } 68 cout<<endl; 69 return 0; 70 } 71 /* 72 9991919190909919 73 */
------------------------欢迎评论----------------------------