写昏头了家人们😇
题意:
原数位和sum若为3的倍数则删除所有的3和0,反之则删除一个%3等于sum%3的数位,然后再删除所有3和0。
需要注意:
- 欲求最大操作次数,则先删0再删其他;
- 当sum不为3的倍数时,删除的数位后若跟有0则会一并视为删除,所以可以先记录%3数位后面跟有0的最小个数,最后再加上最少的0的个数
- 若最后求出的 ans 与 数位长度 len 有 ans == len, 需要ans--(不能为0)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
int t;
cin >> t;
while(t--){
string n;
cin >> n;
int len = n.length();
int sum = 0;
vector<int> minn(3,INT_MAX);
int pre = 0;
int tmp = 0;
for(auto &c : n){
int x = c-'0';
sum += x;
if(pre!=0 && x==0){
tmp++;
}
else if(x != 0){
minn[pre] = min(minn[pre],tmp);
tmp = 0;
pre = x%3;
}
}
int re = sum%3;
int ans = 0;
// cout << re <<' ' << mx[re] << endl;
pre = 0;
if(re != 0 && minn[re] != INT_MAX){//可以减
for(auto &c : n){
int x = c-'0';
if(x%3 == 0){//减去3的倍数和0
ans++;
}
}
ans ++;
if(ans == len) ans--;//应在减去0之前检查,被hack了(悲
ans -= minn[re];
}else if(re == 0){
for(auto &c : n){
int x = c-'0';
if(x%3 == 0){//减去3的倍数和0
ans++;
}
}
if(ans == len) ans--;
}
cout << ans << endl;
}
}
被hack了(悲,已修改😭