• 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)(J) 小乐乐和25


    小乐乐和25

    链接:https://ac.nowcoder.com/acm/contest/301/J
    来源:牛客网

    题目描述

    小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数。
    现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
    对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。

    输入描述:

    多组数据输入

    对于每组数据,只有一行输入一个整数n(1 <= n <= 1000000000)。

    输出描述:

    如果经过最少x次操作后,这个数就变成了25的倍数,那么输出x;

    如果这个数无论怎么变化都变不成25的倍数,输出-1.
    示例1

    输入

    2018

    输出

    -1
    示例2

    输入

    2020

    输出

    1

    说明

    经过一次之后变成2200
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define inf 0x3f3f3f3f
     6 using namespace std;
     7 typedef long long ll;
     8 int n;
     9 int pos00,pos01,pos2,pos5,pos7;
    10 int flag;
    11 int main()
    12 {
    13     while(~scanf("%d",&n))
    14     {
    15         pos00=-1,pos01=-1,pos2=-1,pos5=-1,pos7=-1;
    16         int now=1;
    17         while(n)//找到第一个存在的0,第二个存在的0,第一个存在的2,5,7的具体位置。
    18         {
    19             int tmp=n%10;
    20             if(tmp==0&&pos00==-1)
    21             {
    22                 pos00=now;
    23             }
    24             else if(tmp==0&&pos01==-1)
    25             {
    26                 pos01=now;
    27             }
    28             if(tmp==2&&pos2==-1)
    29             {
    30                 pos2=now;
    31             }
    32             if(tmp==5&&pos5==-1)
    33             {
    34                 pos5=now;
    35             }
    36             if(tmp==7&&pos7==-1)
    37             {
    38                 pos7=now;
    39             }
    40             n/=10;
    41             now++;
    42         }
    43         int minn=inf;
    44         if(pos00!=-1&&pos01!=-1)//如果存在两个0
    45         {
    46             if(pos00==1)//第一个0的位置是0,那么只用移动第二个0的位置到第二位
    47                 minn=min(minn,pos01-2);
    48             else
    49                 minn=min(minn,pos00-1+pos01-2);
    50         }
    51         if(pos00!=-1&&pos5!=-1)
    52         {
    53             if(pos5>pos00)//如果5在0后面,那么不影响,直接把0移动到最后一位,把5移动到倒数第二位
    54             {
    55                 minn=min(minn,pos00-1+pos5-2);
    56             }
    57             else//如果0在5前面,那么如果把5移动到倒数第二位就停止了的话,0移动到最后一位会对5的位置有影响,所以我们应该把5移动到最后一位,然后0之后也移动到最后一位,那么5和0交换就是答案
    58             {
    59                 minn=min(minn,pos5-1+pos00-1);
    60             }
    61         }
    62         if(pos2!=-1&&pos5!=-1)
    63         {
    64             if(pos2>pos5)
    65             {
    66                 minn=min(minn,pos5-1+pos2-2);
    67             }
    68             else
    69             {
    70                 minn=min(minn,pos2-1+pos5-1);
    71             }
    72         }
    73         if(pos7!=-1&&pos5!=-1)
    74         {
    75             if(pos7>pos5)
    76             {
    77                 minn=min(minn,pos5-1+pos7-2);
    78             }
    79             else
    80             {
    81                 minn=min(minn,pos7-1+pos5-1);
    82             }
    83         }
    84         if(minn==inf)
    85         {
    86             puts("-1");
    87         }
    88         else
    89         {
    90             printf("%d
    ",minn);
    91         }
    92     }
    93 }
  • 相关阅读:
    C 找到该列最大的前两个数字
    C 寻找和最大的子序列
    C 找出最长的回文子串(不区分大小写)
    C 字符串数组
    C 寻找重复字符并输出他们的位置
    C 寻找0~100的守形数
    C 在外部函数中修改指针变量
    C int转为二进制 再进行与操作
    C 计算阶乘之和
    C 奇偶校验
  • 原文地址:https://www.cnblogs.com/1013star/p/10054042.html
Copyright © 2020-2023  润新知