Codeforces 988E. Divisibility by 25

解题思路:

  1. 只有尾数为25,50,75,00的数才可能是25的倍数。
  2. 对字符串做4次处理,以25为例。

    a. 将字符串中的最后一个5移到最后一位。计算交换次数。(如果没有找到5,则不可能凑出25,考虑50、75、00)
    b. 字符串已经改变,将此时最后一个2移到倒数第二位。计算交换次数。 (如果没有找到2,则也不可能凑出25,考虑50、75、00)

    c. 将除了最后两位之外的第一个非0的数字移到首位,计算交换次数。(如果找不到除了最后两位之外的非0数字,则不可能凑出25,考虑50、75、00)

    注意:

    我的WA点:

    输入25
    输出0

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int solve(string s, char c1, char c2){
//  cout << s << endl;
    int len = s.length()-1;
    int ans = 0;
    int flag = false;
    for(int i = 0;s[i]; ++i){
        if(s[i] == c2){
            flag = true;
            for(int j = i;j > 0; j--){
                swap(s[j],s[j-1]);
                ans++;
            }
            break;
        }
    }
//  cout << ans << endl;
    if(!flag) return -1;
    flag = false;
    for(int i = 1;s[i]; ++i){
        if(s[i] == c1){
            flag = true;
            for(int j = i;j > 1; j--){
                swap(s[j],s[j-1]);
                ans++;
            }
            break;
        }
    }
    if(!flag) return -1;
    if(len == 1) return ans;
    int con = -1;
    for(int i = len;i > 1; --i){
        if(s[i] != '0'){
            con = i;
            break;
        }
    }
    if(con == -1){
        return -1;
    }else{
        return ans+len-con;
    }
}

int main(){
    ios::sync_with_stdio(false);
    string s;
    while(cin >> s){
        reverse(s.begin(), s.end());
        int ans = INT_MAX;
        int t;
        t = solve(s, '2', '5');
    //  cout << t << endl;
        if(t != -1){
            ans = min(ans, t);
        }
        t = solve(s, '5', '0'); //  cout << t << endl;
        if(t != -1){
            ans = min(ans, t);
        }
        t = solve(s, '7', '5'); //  cout << t << endl;
        if(t != -1){
            ans = min(ans, t);
        }
        t = solve(s, '0', '0'); //  cout << t << endl;
        if(t != -1){
            ans = min(ans, t);
        }
        if(ans == INT_MAX) ans = -1;
        cout << ans << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zhangjiuding/p/9189127.html

时间: 2024-10-11 04:56:21

Codeforces 988E. Divisibility by 25的相关文章

CF 988E Divisibility by 25 思维 第十二

Divisibility by 25 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given an integer nn from 11 to 10181018 without leading zeroes. In one move you can swap any two adjacent digits i

Codeforces Round #486 (Div. 3)988E. Divisibility by 25技巧暴力||更暴力的分类

传送门 题意:给定一个数,可以对其做交换相邻两个数字的操作.问最少要操作几步,使得可以被25整除. 思路:问题可以转化为,要做几次交换,使得末尾两个数为00或25,50,75: 自己一开始就是先for一遍,记录四种可能对于的步数,再对四种可能讨论(有前导0的情况):自己是在数据中,该对了自己的代码, 看了队长和%王宣凯的代码,觉得那才是现场能ac的思路.--暴力交换: #include <iostream> #include <cstdio> #include <algori

Codeforces Round #486 (Div. 3) E. Divisibility by 25

E. Divisibility by 25 能被25整除的充要条件就是末两位是00,25,50,75.如果没有过程中不出现前导0这一限制,显然对每种情况,贪心取尽量低位即可.本题的关键就在于如何满足这个条件,首先有个"显然"的方法:讨论...然后会发现情况太多,过于复杂.所以,我们只好从交换本身的性质入手,找找易于实现的写法.注意到我们最多移动3个数字的位置,最终两个最低位的数,可能还有一个非0数作为最高位,而根据交换的性质,可以发现先移动那个数对于最终的结果没有影响,按照题意我们要先

Codeforces 922F Divisibility 构造

Divisibility 我们考虑删数字 首先我们可以发现有一类数很特殊就是大于 n / 2的素数, 因为这些素数的贡献只有1, 并且在n大的时候, 这些素数的个数不是很少, 我们可以最后用这些数去调整, 并且删掉一个数的时候删掉的是它的因子个数, 所以可以用素数去控制最后的数量.当n小的时候直接状压枚举. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak

CodeForces 597A Divisibility

水题. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> using namespace std; long long k,L,R; int main() { scanf("%lld%lld%lld",&k,&L,&R); long

CodeForces 550C Divisibility by Eight(枚举)

[题目链接]click here~~ [题目大意] 给一个不超过100位的数字,要求能否删掉几位数,剩下的数能被8整除 [解题思路]:这里有个性质:如果一个数后三位能被8整除,那么这个数就能被8整除 证明:举一个5位数的例子吧, 例如 _____  _____  __              __  __                __  ___ abcde=ab000+cde=1000×ab+cde=8×125×ab+cde 很明显,8×125×ab一定是8或者125的倍数,因此当cde

CodeForces - 550C Divisibility by Eight

题意:给你一串数问你能不能选几个数组合起来的数被8整除 思路:位数很小,所以直接暴力就好了,判断能不能被8整除是看一个数的后三位,至于为什么要写这篇题解呢,是因为wa了一发,看了其他人的题解,学到了一些东西,就是在字符串读入的时候可以向后扩几位,把前面补为0,这样就不用考虑低于3位的情况,这方法真聪明. 代码: #include <bits/stdc++.h> using namespace std; char a[1005]; int main() { while(~scanf("

【赛时总结】◇赛时&#183;V◇ Codeforces Round #486 Div3

◇赛时·V◇ Codeforces Round #486 Div3 又是一场历史悠久的比赛,老师拉着我回来考古了--为了不抢了后面一些同学的排名,我没有做A题 ◆ 题目&解析 [B题]Substrings Sort +传送门+   [暴力模拟] 题意 给出n个字符串,你需要将它们排序,使得对于每一个字符串,它前面的字符串都是它的子串(对于字符串i,则字符串 1~i-1 都是它的子串). 解析 由于n最大才100,所以 O(n3) 的算法都不会爆,很容易想到暴力模拟. 如果字符串i是字符串j的子串

CodeForces 825G&quot;Tree Queries&quot;(建树选根)

传送门 •参考资料 [1]:CodeForces 825G Educational Round #25 G :建树选根大法+O1大法+iostream解绑了还是慢 •题意 给定一颗包含 n 个节点的树,开始树的所有节点都是白色的: 给出 q 次询问,询问分为1.2两种: 将节点 x 涂成黑色. 询问节点 x 到所有的黑点节点的简单路径中的标号最小的那个点(包括起点和黑点) 题目保证第一次询问是 1 类型的. •题解 如果我们随便选取某节点作为根节点,那么询问的时候,我们要找到节点 x 到所有黑色