题解 | #小红的数字删除#
小红的数字删除
https://www.nowcoder.com/practice/46a73f7cb2ab4a56bdb372b282b23c1e
#include <iostream> #include <map> #include <vector> using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; ++i) { string str; cin >> str; int sum = 0; map<int, int> mp; for (char ch : str) { sum = sum + ch - '0'; if (mp.count(ch - '0')) { mp[ch - '0'] = mp[ch - '0'] + 1; } else { mp[ch - '0'] = 1; } } if (sum < 3) { cout << 0 << endl; continue; } int ans = 0; int flag = 0; if (sum % 3 != 0) { for (int i = 1; i < 9; ++i) { // 有一个数,删除后大于等于3, 是3的倍数 if (mp[i] > 0 && sum - i >= 3 && (sum - i) % 3 == 0) { // 这个数只有一个,且在首位, 且第二位是0,暂时跳过 if (str[0] - '0' == i && mp[i] == 1 && str[1] == '0') { flag = i; continue; } mp[i]--; ans++; sum -= i; break; } } if (flag) { mp[flag]--; ans++; sum -= flag; for (int i = 1; i < str.size(); ++i) { if (str[i] != '0') { break; } mp[0]--; } } // 没有数可以删除 if (ans == 0) { cout << 0 << endl; continue; } } // 所有的0都可以 ans += mp[0]; // 1、先删除所有的3的倍数 ans = ans + mp[3] + mp[6] + mp[9]; // 2、计算一下,去除所有三的倍数后,剩下的数是否可以组成3的倍数。 // 否则就留一个不删除 if (sum - mp[3] * 3 - mp[6] * 6 - mp[9] * 9 < 3) { ans--; } cout << ans << endl; } } // 64 位输出请用 printf("%lld")
前导0的情况不好处理,