zoukankan      html  css  js  c++  java
  • codeforces 770b

    原题链接:

      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
    ",d-1,c[d-1]);
    41             }
    42             c[d++]=9-a[i];
    43             sum2+=c[d-1];
    44         //    printf("c[%d]=%d
    ",d-1,c[d-1]);
    45         }
    46     }
    47 //    printf("sum1=%d,sum2=%d
    ",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 */

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

  • 相关阅读:
    Keepalived 无法自动转换主备角色,请关注 iptables 防火墙配置
    Linux 下使用网易的SMTP服务器 发送邮件
    Spring-boot 最小demo
    go build 时报错 cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
    spark-shell 执行脚本并传入参数
    JVM
    spark
    spark
    linux
    linux
  • 原文地址:https://www.cnblogs.com/x-x-y/p/6915321.html
Copyright © 2011-2022 走看看