1. 程式人生 > 其它 >CF1593B Make it Divisible by 25

CF1593B Make it Divisible by 25

洛谷題面

題目大意

\(T\) 組資料。

對於每組資料:

給定一個整數,求出你至少需要刪除該整數的幾個數字來使這個整數變成 \(25\) 的倍數?

題目分析

結論:任一個 \(25\) 的正整數倍數的結尾為 00255075

證明:

\(y=25x\)\(x\) 為正整數)。

\(x=1\) 時,\(y\)\(25\)

\(x=2\) 時,\(y\)\(50\)

\(\cdots\)

\(x=m\) 時,\(y\) 為:

\(25m\)

\(=25(m-1)+25\)

\(=25(m-2)+25\times2\)

\(\cdots\)

\(=25+(m-1)\times25\)

於是易得結論。


我們把 \(00\)\(25\)\(50\)\(75\) 這四個數存入一個二維字串,並稱為倍數串。

在輸入數時,可以也用字串讀入,這樣方便比較。

如果比對得上,那麼立即匹配下一個倍數串,在所有值中取最小值。


剩下的看一下程式碼。

程式碼

//2021/10/13

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <cstdio>

#include <string>

#include <algorithm>

#define int long long

#define enter() putchar(10)

#define debug(c,que) cerr<<#c<<" = "<<c<<que

#define cek(c) puts(c)

#define blow(arr,st,ed,w) for(register int i=(st);i<=(ed);i++)cout<<arr[i]<<w;

namespace Newstd
{
	inline int read()
	{
		char c;
		bool flag=false;
		while((c=getchar())<'0' || c>'9')
		{
		    if(c=='-') flag=true;
		}
		int res=c-'0';
		while((c=getchar())>='0' && c<='9')
		{
		    res=(res<<3)+(res<<1)+c-'0';
		}
		return flag?-res:res;
	}
	inline void print(int x)
	{
		if(x<0)
		{
			putchar('-');x=-x;
		}
		if(x>9)
		{
			print(x/10);
		}
		putchar(x%10+'0');
	}
}

using namespace Newstd;

using namespace std;

string tmp[5];

inline void solve(string str)
{
	int ans=str.size(),len=str.size();
	
	for(register int i=0;i<=3;i++)
	{
		int idx=1;
		
		for(register int j=len-1;j>=0;j--)
		{
			if(tmp[i][idx]==str[j])
			{
			    idx--;
			}
			
			if(idx==-1)
			{
			    ans=min(ans,len-j-2);
			    
			    break;
			}
		}
	}
	
	cout<<ans<<'\n';
}

#undef int

int main(void)
{
	#define int long long
	
	std::ios::sync_with_stdio(false);
	
	tmp[0]="00";
	
	tmp[1]="25";
	
	tmp[2]="50";
	
	tmp[3]="75";
	
	int T;
	
	cin>>T;
	
	while(T--)
	{
		string str;
		
		cin>>str;
		
		solve(str);
	} 
	
	return 0;
}