题解 CF1593B Make it Divisible by 25

智子

2021-10-14 22:13:46

Solution

## 题意 输入一个正整数 $n$,删去若干位数使其能被 25 整除,求最少要删去多少位数字。 数据范围:$25 \leq n \leq 10^{18}$ ## 思路 25 的倍数的特征很简单:末尾两位数是 00、25、50、75,所以我们可以考虑进行贪心: 从最后一位出发,找到最低位的 0 和最低位的 5,记录为第 $p$ 位和第 $q$ 位。 然后再从第 $p$ 位出发,向左找到遇到的第一个 0 或 5,将这两位后面的所有数都删去,更新答案;从第 $q$ 位出发,向左找到遇到的第一个 2 或 7,将这两位后面的所有数都删去,更新答案。 ## 代码 代码实现比较简单,但要注意细节。 ```cpp #include<iostream> using namespace std; const int MAXN = 100 + 5; int a[MAXN]; int len = 0; int main() { int T; cin >> T; while(T--) { long long n; cin >> n; len = 0; long long t = n; while(t != 0) { a[++len] = t % 10; t /= 10; } int p = len, q = len, ans = len; for(int i = len; i >= 1; i--) { if(a[i] == 0) { p = i; } else if(a[i] == 5) { q = i; } } for(int i = p + 1; i <= len; i++) { if(a[i] == 0 || a[i] == 5) { ans = min(ans, i - 2); } } for(int i = q + 1; i <= len; i++) { if(a[i] == 2 || a[i] == 7) { ans = min(ans, i - 2); } } cout << ans << endl; } return 0; } ```