CF1593B Make it Divisible by 25
阿新 • • 發佈:2021-10-15
題目大意
有 \(T\) 組資料。
對於每組資料:
給定一個整數,求出你至少需要刪除該整數的幾個數字來使這個整數變成 \(25\) 的倍數?
題目分析
結論:任一個 \(25\) 的正整數倍數的結尾為 00
或 25
或 50
或 75
。
證明:
令 \(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; }