链接: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
能整除25的最后两位只有4种:00,25,50,75
先判断是否有这种情况,如果有就算一下操作数,最后输出所以操作数里的最小值
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
string s;
while(cin>>s){
bool y0[15],y2[15],y5[15],y7[15];
int t0=0,t2=0,t5=0,t7=0;
memset(y0,0,sizeof(y0));
memset(y2,0,sizeof(y2));
memset(y5,0,sizeof(y5));
memset(y7,0,sizeof(y7));
int m=s.size()-1;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0') {
y0[i]=true;
t0++;
}
else if(s[i]=='2') y2[i]=true,t2++;
else if(s[i]=='5') y5[i]=true,t5++;
else if(s[i]=='7') y7[i]=true,t7++;
}
if(t0<2&&(t2==0||t5==0)&&(t5==0||t0==0)&&(t7==0||t5==0))
printf("-1\n");
else{
int temp=999999999;
if(t0>=2){//00
int t=0,flag=0;
for(int i=m;i>=0;i--){
if(y0[i]&&flag<2) t+=m-i,flag++;
if(flag>=2) {
t-=1;
break;
}
}
temp=min(t,temp);
}
if(t2&&t5){//25
int t=0,p;
for(int i=m;i>=0;i--){
if(y5[i]) {
t+=m-i;
p=i;
break;
}
}
for(int i=m;i>=0;i--){
if(y2[i]){
t+=m-1-i;
if(p<i) t+=1;
break;
}
}
temp=min(t,temp);
}
if(t5&&t0){//50
int t=0,p;
for(int i=m;i>=0;i--){
if(y0[i]) {
t+=m-i;
p=i;
break;
}
}
for(int i=m;i>=0;i--){
if(y5[i]){
t+=m-1-i;
if(p<i) t+=1;
break;
}
}
temp=min(t,temp);
}
if(t7&&t5){//75
int t=0,p;
for(int i=m;i>=0;i--){
if(y5[i]) {
t+=m-i;
p=i;
break;
}
}
for(int i=m;i>=0;i--){
if(y7[i]){
t+=m-1-i;
if(p<i) t+=1;
break;
}
}
temp=min(t,temp);
}
printf("%d\n",temp);
}
}
return 0;
}