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 in the given number in such a way that the resulting number will not contain leading zeroes. In other words, after each move the number you have cannot contain any leading zeroes.

What is the minimum number of moves you have to make to obtain a number that is divisible by 2525? Print -1 if it is impossible to obtain a number that is divisible by 2525.

Input

The first line contains an integer nn (1≤n≤10181≤n≤1018). It is guaranteed that the first (left) digit of the number nn is not a zero.

Output

If it is impossible to obtain a number that is divisible by 2525, print -1. Otherwise print the minimum number of moves required to obtain such number.

Note that you can swap only adjacent digits in the given number.

Examples

input

Copy

5071

output

Copy

4

input

Copy

705

output

Copy

1

input

Copy

1241367

output

Copy

-1

Note

In the first example one of the possible sequences of moves is 5071 →→ 5701 →→ 7501 →→ 7510 →→ 7150.

题意: 可以移动每位数的位置,使得移动后的数字是25的倍数,问最小需要移动多少位?

emmmmm,好多特殊情况,wa了很多发

能整除25,则最后两位只能是00,25,50,75

枚举0,2,5,7的个数

然后判断这四种情况,需要注意的是如果处于后面的数在前面了,如果此时另一个数不在末位则移动次数需加一

还有如果从第二位开始有连续的0的话且要移动的数位置在第一位此时移动可能导致开头为0,需要多移动0的个数次,还有特判要用到的0在第二位此时需要加的次数少一

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 3*1e3 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
int main(){
    std::ios::sync_with_stdio(false);
    string s;
    while( cin >> s ) {
        ll a = -1, b = -1, c = -1, d = -1, num = 0, ta;
        for( ll i = 0; i < s.length(); i ++ ) {
            if( s[i] == ‘0‘ ) {
                num ++;
                if( num >= 2 ) {
                    ta = a;
                }
                a = i;
            } else if( s[i] == ‘2‘ ) {
                b = i;
            } else if( s[i] == ‘5‘ ) {
                c = i;
            } else if( s[i] == ‘7‘ ) {
                d = i;
            }
        }
        ll ans1 = 1e12, ans2 = 1e12, ans3 = 1e12, ans4 = 1e12;
        bool flag = false;
        //debug(a), debug(b), debug(c),debug(d),debug(num);
        if( a != -1 && c != -1 ) {
            if( a < c ) {
                if( c == s.length() - 1 ) {
                    ans1 = min( s.length() - 1 - a, ans1 );
                } else {
                    ans1 = min( s.length() - 1 - a + s.length() - 2 - c + 1, ans1 );
                }
            } else {
                ans1 = min( s.length() - 1 - a + s.length() - 2 - c, ans1 );
            }
            ll t = 0, i = 1;
            while( s[i] == ‘0‘ ) {
                t ++;
                i ++;
            }
            if( s[1] == ‘0‘ && ( a == 0 || c == 0 ) ) {
                if( s.length() == 3 ) {
                    flag = true;
                } else {
                    ans1 += t;
                    if( a == 1 ) {
                        ans1 --;
                    }
                }
            }
        }
        if( c != -1 && b != -1 ) {
            if( c < b ) {
                if( b == s.length() - 1 ) {
                    ans2 = min( s.length() - 1 - c, ans2 );
                } else {
                    ans2 = min( s.length() - 1 - c + s.length() - 2 - b + 1, ans2 );
                }
            } else {
                ans2 = min( s.length() - 1 - c + s.length() - 2 - b, ans2 );
            }
            ll t = 0, i = 1;
            while( s[i] == ‘0‘ ) {
                t ++;
                i ++;
            }
            if( s[1] == ‘0‘ && ( b == 0 || c == 0 ) ) {
                if( s.length() == 3 ) {
                    flag = true;
                } else {
                    ans2 += t;
                }
            }
        }
        if( c != -1 && d != -1 ) {
            if( c < d ) {
                if( d == s.length() - 1 ) {
                    ans3 = min( s.length() - 1 - c, ans3 );
                } else {
                    ans3 = min( s.length() - 1 - c + s.length() - 2 - d + 1, ans3 );
                    //debug(ans);
                }
            } else {
                ans3 = min( s.length() - 1 - c + s.length() - 2 - d, ans3 );
            }
            ll t = 0, i = 1;
            while( s[i] == ‘0‘ ) {
                t ++;
                i ++;
            }
            if( s[1] == ‘0‘ && ( d == 0 || c == 0 ) ) {
                if( s.length() == 3 ) {
                    flag = true;
                } else {
                    ans3 += t;
                }
            }
        }
        //debug(ans);
        if( num >= 2 ) {
            ans4 = min( ans4, s.length() - 1 - a + s.length() - 2 - ta );
        }
        ll ans = min( min( ans1, ans2 ), min( ans3, ans4 ) );
        if( ans == 1e12 && !flag ) {
            cout << -1 << endl;
        } else {
            cout << ans << endl;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/l609929321/p/9221787.html

时间: 2024-10-05 05:29:00

CF 988E Divisibility by 25 思维 第十二的相关文章

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

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

Codeforces 988E. Divisibility by 25

解题思路: 只有尾数为25,50,75,00的数才可能是25的倍数. 对字符串做4次处理,以25为例. a. 将字符串中的最后一个5移到最后一位.计算交换次数.(如果没有找到5,则不可能凑出25,考虑50.75.00) b. 字符串已经改变,将此时最后一个2移到倒数第二位.计算交换次数. (如果没有找到2,则也不可能凑出25,考虑50.75.00) c. 将除了最后两位之外的第一个非0的数字移到首位,计算交换次数.(如果找不到除了最后两位之外的非0数字,则不可能凑出25,考虑50.75.00)

【笔记】得到-《梁宁&#183;产品思维三十讲》

ps:偶然从[得到]上听到梁宁的<产品思维三十讲],感觉很棒,抽时间听完了所有的课程,特整理笔记如下. 01发刊词|产品能力是每个人的底层能力 产品能力就是训练一个人:判断信息,抓住要点,整合有限的资源,把自己的价值打包成一个产品向世界交付,并且获得回报. 通过这30讲,希望拥有三个东西: 1.一双眼睛.发现痛点.找到破局点的敏锐之眼: 2.一双手.动手优化,着手改变的行动之手: 3.一颗心.洞察人性的同理心,懂得自己与用户,懂得产品上每个细节给到人的满足感.确认感和依赖感. 02案例:用户体验

linux十二周三次课 (4月25日)笔记

十二周三次课 (4月25日)12.10 Nginx访问日志12.11 Nginx日志切割12.12 静态文件不记录日志和过期时间 12.10 Nginx访问日志 配置文件的格式在主配置文件里. 搜索log,找到如下段内容,这段内容是用来定义格式. 公网IP,在百度,搜索IP,查看. 定义访问日志路径 打开文件 在}下加入一行,改为如下: 12.11 Nginx日志切割 编辑文件 加入以下内容 执行的过程 删除日志的格式 写完日志,写一个脚本. 12.12 静态文件不记录日志和过期时间 写入如下内

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

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

【第五组】第十二次冲刺例会纪要 2017/7/25

第十二次冲刺例会纪要 开发小组:Hunger Killer 冲刺经理:衣俊霖 小组成员:张竣杰,董泽昊,赵美,宋寅瑜,徐志国 A:张竣杰 负责部分:管理员界面 昨日所做工作:优化界面,为发布努力 遇到的问题:下拉列表刷新问题 今日计划:尝试解决 B:衣俊霖 负责部分:注册界面 昨日所做工作:与发布经理相伴写注册后端,加提示弹窗,为发布努力 遇到的问题:有些细节没写 今日计划:解决问题,写登录后端 C:董泽昊 负责部分:趣味决策 昨日所做工作:与冲刺经理相伴写注册后端,研究图片传输,写发布说明,为

《构建之法》第十一、十二章学习总结

第十一章的内容是软件设计与实现. 在第一节中,讲的是关于分析和设计方法,向我们介绍在"需求分析"."设计与实现"阶段."测试""发布"阶段该搞清楚的问题. 在第二节中,讲的是关于图形建模和分析方法.在表达实体和实体之间的关系时,可以用到思维导图(Mind Map).实体关系图(ERD).UCD ;在表达数据的流动时,可以用到DFD工具:在表达控制流的时候可以用到FSM工具:前面提到的这些图形建模方法各有特点,UML却可以有一个

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

C primer plus 第五版十二章习题

看完C prime plus(第五版)第十二章,随带完成了后面的习题. 1.不使用全局变量,重写程序清单12.4的程序. 先贴出12.4的程序,方便对照: 1 /* global.c --- 使用外部变量 */ 2 #include <stdio.h> 3 int units = 0; //一个外部变量 4 void critic(void); 5 int main(void) 6 { 7 extern int units; 8 9 printf ("How many pounds