J 小乐乐和25 (哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级))
原创
©著作权归作者所有:来自51CTO博客作者mb5f5b1df7f1e34的原创作品,请联系作者获取转载授权,否则将追究法律责任
链接:https://ac.nowcoder.com/acm/contest/301/J 来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。
输入描述:
多组数据输入
对于每组数据,只有一行输入一个整数n(1 <= n <= 1000000000)。
输出描述:
如果经过最少x次操作后,这个数就变成了25的倍数,那么输出x;
如果这个数无论怎么变化都变不成25的倍数,输出-1.
示例1
输入
复制
2018
输出
复制
-1
示例2
输入
复制
2020
输出
复制
1
说明
经过一次之后变成2200
分析:
只要末尾为00 25 50 75 就行
接下来枚举构造就行
注意:
交换后首字母不能为0
#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
#define N 100000+5
#define rep(i,n) for(int i=0;i<n;i++)
#define sd(n) scanf("%d",&n)
#define pd(n) scanf("%d\n",n)
#define MAX 26
typedef long long ll;
const ll mod=1e9+7;
ll n,m;
string s;
int flag2=0;
ll f(char x,char y,int n,string s1)
{
ll t;
ll pos=-1;
int flag1=0;
//cout<<x<<" "<<y<<endl;
for(int i=n-1;i>=0;i--)
{
if(s1[i]==y)
{
t=(n-i-1);
//cout<<t<<endl;
pos=i;
flag1=1;
break;
}
}
if(flag1==1)
for(int i=pos;i<n-1;i++)
{
swap(s1[i],s1[i+1]);
}
//cout<<pos<<" "<<s1<<endl;
if(flag1==0) return 1e18;
int vis=0;
for(int i=n-2;i>=0;i--)
{
if(s1[i]==x)
{
t+=(n-1-i-1);//cout<<t<<endl;
flag2=1;
pos=i;
vis=1;
break;
}
}
if(flag2==0||vis==0) return 1e18;
for(int i=pos;i<n-2;i++)
{
swap(s1[i],s1[i+1]);
}
//cout<<t<<" "<<s1<<endl;
if(s1[0]=='0')
{
// cout<<22<<endl;
for(int i=1;i<n-2;i++)
{
if(s1[i]!='0')
{
t+=i;
break;
}
}
}
return t;
}
int main()
{
while(cin>>s)
{
flag2=0;
ll len=s.length();
ll a=f('0','0',len,s);
ll b=f('2','5',len,s);
ll c=f('5','0',len,s);
ll d=f('7','5',len,s);
//cout<<a<<b<<" "<<c<<d<<endl;
if(flag2==1)
cout<<min(min(min(a,b),c),d)<<endl;
else
cout<<-1<<endl;
}
return 0;
}