小小总结—— 数字删除

  • 问题 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)
//C
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//C++
//#include<unordered_map>
#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 scanf scanf_s
#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;
}
//分割线---------------------------------QWQ
/*
 
 
1234
 
10
 
 
 
*/
 
/*
 
f(n) = ln(n) + C + 1 / 2 * n
double C = 0.57721566490153286060651209;
*/

猜你喜欢

转载自blog.csdn.net/qq_45739057/article/details/105485669