原题链接:

  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 */

------------------------欢迎评论----------------------------