- 问题 C: 数字删除
- 题目描述
小明最近在研究一个数字删除游戏,正要考考佳佳。游戏规则如下
给定一个正整数,去掉其中若干个数字后剩下的数字按原左右次序将组成一个新的正整数。请问最少删去几个数字,能够使得这个新的正整数合法(不含前导0)且是3的倍数。
小明写下的数字太大,佳佳一时处理不了。请你帮他写一个程序处理出结果吧!
输入
第一行一个整数n(n≤5),表示小明写下了n正整数
第2~n+1行每行一个正整数Ai(Ai≤10100000),数字的长度可能达到100001位。
输出
共n行,每行一个整数,表示最少删去的数字的个数。如果没有合法的方案,请输出“ERR”(不含引号)。
- 样例输入
3
1234
1000
2
- 样例输出
1
3
ERR
- 提示
第一组删除1个留下的整数为234或123。
第二组删除3个留下的整数为0。
#pragma GCC optimize(2)
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<istream>
#include<iomanip>
#include<cstdio>
#include<stack>
#include<string>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define N 110
#define DoIdo main
#define it set<ll>::iterator
typedef long long ll;
typedef unsigned long long ull;
const int mod = 9973;
const int INF = 1e9;
const int maxn = 1e6 + 10;
using namespace std;
string s;
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
int DoIdo() {
ios::sync_with_stdio(false);
int n;
cin >> n;
while (n--) {
cin >> s;
int len = s.size();
int sum = 0;
for (int i = 0; i < len; i++) {
sum += s[i] - '0';
}
if (len == 1 && sum % 3 != 0) {
cout << "ERR" << endl;
}
else if (len == 2 && sum % 3 != 0) {
int val1 = s[0] - '0';
int val2 = s[1] - '0';
if (val1 % 3 == 0 || val2 % 3 == 0) {
cout << 1 << endl;
}
else cout << "ERR" << endl;
}
else if (sum % 3 == 0) {
cout << 0 << endl;
}
else if (sum % 3 == 1) {
int cnt = 0;
for (int i = len - 1; i >= 0; i--) {
int val = s[i] - '0';
if (val % 3 == 1) {
cnt++;
s.erase(i, 1);
break;
}
}
if (cnt == 1) {
int j = 0;
while (s[j++] == '0') cnt++;
if (cnt >= len) cout << len - 1 << endl;
else cout << cnt << endl;
}
else {
cnt = 0;
for (int i = len - 1; i >= 0; i--) {
int val = s[i] - '0';
if (val % 3 == 2) {
cnt++;
s.erase(i, 1);
if (cnt == 2) break;
}
}
if (cnt == 2) {
int j = 0;
while (s[j++] == '0') cnt++;
if (cnt >= len) cout << len - 1 << endl;
else cout << cnt << endl;
}
}
}
else if (sum % 3 == 2) {
int cnt = 0;
for (int i = len - 1; i >= 0; i--) {
int val = s[i] - '0';
if (val % 3 == 2) {
cnt++;
s.erase(i, 1);
break;
}
}
if (cnt) {
int j = 0;
while (s[j++] == '0') cnt++;
if (cnt >= len) cout << len - 1 << endl;
else cout << cnt << endl;
}
else {
cnt = 0;
for (int i = len - 1; i >= 0; i--) {
int val = s[i] - '0';
if (val % 3 == 1) {
cnt++;
s.erase(i, 1);
if (cnt == 2) break;
}
}
if (cnt == 2) {
int j = 0;
while (s[j++] == '0') cnt++;
if (cnt >= len) cout << len - 1 << endl;
else cout << cnt << endl;
}
}
}
}
return 0;
}