写昏头了家人们😇

题意:

原数位和sum若为3的倍数则删除所有的3和0,反之则删除一个%3等于sum%3的数位,然后再删除所有3和0。

需要注意:

  1. 欲求最大操作次数,则先删0再删其他;
  2. 当sum不为3的倍数时,删除的数位后若跟有0则会一并视为删除,所以可以先记录%3数位后面跟有0的最小个数,最后再加上最少的0的个数
  3. 若最后求出的 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了(悲,已修改😭