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


    题目描述 

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

    输入描述:

    多组数据输入

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

    输出描述:

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

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

    解题思路:

    写出25的倍数

    25、50、100、125、150、175、200、225、250、275、300....

    其实最后交换得到的数能不能被 25 整除 关键在于 最后两位 是不是 00、 25、 50、 75

    因为百位以上可以被 100 整除,所以判断 最后两位即可,分四类讨论一下,判断那种交换方式操作次数最小。

    AC  code:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <map>
     7 #define INF 0x3f3f3f3f
     8 #define LL long long
     9 using namespace std;
    10 const int MAXN = 100;
    11 char num[MAXN];
    12 int len;
    13 
    14 int cou(int v1, int v2)
    15 {
    16     if(v1==len-1)   return len-1-v2;
    17     else if(v2<v1)   return len-2-v1-1+len-1-v2;
    18     else if(v1<v2)   return len-2-v1+len-1-v2;
    19     return 100;
    20 }
    21 
    22 int main()
    23 {
    24     while(~scanf("%s", num)){
    25         len = strlen(num);
    26         int zo1 = -1, zo2 = -1, sev = -1, two = -1, five = -1;
    27         for(int i = len-1; i >= 0; i--){
    28             if(num[i] == '0'){
    29                 if(zo2 != -1) continue;
    30                 if(zo1 == -1) zo1 = i;
    31                 else zo2 = i;
    32             }
    33 
    34             if(num[i] == '2'){
    35                 if(two == -1) two = i;
    36             }
    37 
    38             if(num[i] == '5'){
    39                 if(five == -1) five = i;
    40             }
    41 
    42             if(num[i] == '7'){
    43                 if(sev == -1) sev = i;
    44             }
    45         }
    46         int ans = 101;
    47         if(zo1 != -1 && zo2 != -1) ans = min(ans, cou(zo2, zo1));   //00
    48         if(two != -1 && five != -1) ans = min(ans, cou(two, five)); //25
    49         if(five != -1 && zo1 != -1) ans = min(ans, cou(five, zo1)); //50
    50         if(sev != -1 && five != -1) ans = min(ans, cou(sev, five));  //75
    51 
    52         if(ans == 101) puts("-1");
    53         else printf("%d
    ", ans);
    54     }
    55     return 0;
    56 
    57 }
     
  • 相关阅读:
    Windows Server 2008 IIS安装FTP及端口配置
    Zabbix 3.4过滤多余的windows网卡监控
    Linux下统计当前文件夹下的文件个数、目录个数
    CentOS 7 使用 ACL 设置文件权限
    Linux服务器CPU使用率较低但负载较高
    Linux下通过 rm -f 删除大量文件时报错:Argument list too long
    nginx环境安装配置fail2ban屏蔽攻击ip
    CentOS 服务器添加简易"回收站"
    游戏行业DDoS攻击解决方案
    使用 fail2ban 防御 SSH 服务器的暴力破解攻击
  • 原文地址:https://www.cnblogs.com/ymzjj/p/10052530.html
Copyright © 2020-2023  润新知