6249 2023. 11. 08 23:21:32 CWM Diana and Numbers cpp17 Elfogadva 100/100 32ms 5688 KiB
#include <iostream>
#include <string>

using namespace std;

string largerString(string a, string b) {
	int idxa = 0;
	int idxb = 0;
	while (idxa<a.size() && a[idxa] == '0') {
		idxa++;
	}
	while (idxb < b.size() && b[idxb] == '0') {
		idxb++;
	}
	a.erase(0, idxa);
	b.erase(0, idxb);
	if (a.size() > b.size()) return a;
	else if (b.size() > a.size()) return b;
	else {
		for (size_t i = 0; i < a.size(); i++)
		{
			if (a[i] > b[i]) return a;
			if (b[i] > a[i]) return b;
		}
	}
	return a;
}
bool validString(string s) {
	for (size_t i = 0; i < s.size(); i++)
	{
		if (s[i] != '0') return true;
	}
	return false;
}
string RemoveWorstChar(string input, int divBranch) {
	int changeVal1 = -10;
	int lr1 = 100'001;
	int lr1Index = -1;
	for (size_t j = 0; j < input.size(); j++)
	{
		int val = input[j] - '0';
		if (val % 3 == divBranch) {
			if (j == input.size() - 1) {
				if ((changeVal1 <= 0 || lr1>1) /*&& (lr1Index==-1 || input[lr1Index]>=input[j])*/) {
					lr1 = 1;
					lr1Index = j;
					changeVal1 = 0;
				}
			}
			for (size_t k = j + 1; k < input.size(); k++)
			{
				if (j > 0 || input[k] != '0') {
					int curlr = k - j;
					int curCV = input[k] - input[j];
					if (curlr == 1 && curCV > 0) {
						changeVal1 = curCV;
						lr1 = 1;
						lr1Index = j;
						j = input.size();
						k = input.size();
					}
					else if (curlr == 1 && changeVal1<=0) {
						changeVal1 = curCV;
						lr1 = 1;
						lr1Index = j;
					}
					else if (curlr < lr1) {
						lr1 = curlr;
						changeVal1 = curCV;
						lr1Index = j;
					}
					else if (curlr == lr1 && curCV >= changeVal1) {
						changeVal1 = curCV;
						lr1Index = j;
					}
					break;
				}
				else if (k == input.size() - 1 && lr1 == 100'001) return "0";
			}
		}
		//cout << lr1Index << " " << changeVal1 << " " << lr1 << "\n";
	}
	if (lr1 != 100'001) {
		input.erase(lr1Index, lr1);
	}
	return input;
}
bool DivBy3(string input) {
	int sum = 0;
	for (size_t i = 0; i < input.size(); i++)
	{
		sum += input[i] - '0';
	}
	if (sum % 3 == 0) return true;
	return false;
}
bool BruteForce(string input, string result) {
	const string inp = input;
	string bestSoFar = "0";
	if (DivBy3(input)) {
		bestSoFar = largerString(bestSoFar, input);
	}
	for (size_t i = 0; i < inp.size(); i++)
	{
		input = inp;
		input.erase(i,1);
		if (DivBy3(input)) {
			bestSoFar = largerString(bestSoFar, input);
		}
	}
	for (size_t i = 0; i < inp.size(); i++)
	{
		for (size_t j = i; j < inp.size()-1; j++)
		{
			input = inp;
			input.erase(i,1);
			input.erase(j,1);
			if (DivBy3(input)) {
				bestSoFar = largerString(bestSoFar, input);
			}
		}
	}
	if (result == bestSoFar) return true;
	return false;
}

int main()
{
	int a;
	cin >> a;
	for (size_t i = 0; i < a; i++)
	{
		string input;
		cin >> input;
		/*string input = to_string(i);*/
		int inpSum = 0;
		int oneLeft = 0;
		int twoLeft = 0;
		for (size_t j = 0; j < input.size(); j++)
		{
			inpSum += input[j] - '0';
			if (input[j] % 3 == 1) oneLeft++;
			else if (input[j] % 3 == 2) twoLeft++;
		}
		inpSum %= 3;
		// 0
		if (inpSum == 0) {
			cout << input << "\n";
			continue;
		}
		// 1
		if (inpSum == 1) {
			string res1 = "0";
			string res2 = "0";
			if (oneLeft > 0) {
				res1 = RemoveWorstChar(input, 1);
			}
			//1.2
			if (twoLeft > 1 && input.size()-res1.size()>1) {
				res2 = RemoveWorstChar(input, 2);
				res2 = RemoveWorstChar(res2, 2);
			}
			string sol = largerString(res1, res2);
			if (validString(sol)) cout << sol << "\n";
			else cout << "-1\n";
			/*if (!validString(sol)) sol = "";
			if (!BruteForce(input, sol)) cout << input << "\n";*/
		}
		// 2
		if (inpSum == 2) {
			string res1 = "0";
			string res2 = "0";
			if (twoLeft > 0) {
				res1 = RemoveWorstChar(input, 2);
			}
			//1.2
			if (oneLeft > 1 && input.size() - res1.size() > 1) {
				res2 = RemoveWorstChar(input, 1);
				res2 = RemoveWorstChar(res2, 1);
			}
			string sol = largerString(res1, res2);
			if (validString(sol)) cout << sol << "\n";
			else cout << "-1\n";
			/*if (!validString(sol)) sol = "";
			if(!BruteForce(input, sol)) cout << input << "\n";*/
		}
	}
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1688 KiB
subtask2 9/9
2 Elfogadva 3ms 1924 KiB
3 Elfogadva 3ms 2188 KiB
subtask3 12/12
4 Elfogadva 3ms 2280 KiB
5 Elfogadva 3ms 2492 KiB
6 Elfogadva 3ms 2732 KiB
7 Elfogadva 3ms 2944 KiB
8 Elfogadva 3ms 3140 KiB
9 Elfogadva 3ms 3152 KiB
subtask4 27/27
10 Elfogadva 28ms 4324 KiB
subtask5 52/52
11 Elfogadva 14ms 3604 KiB
12 Elfogadva 32ms 3800 KiB
13 Elfogadva 30ms 4912 KiB
14 Elfogadva 32ms 5236 KiB
15 Elfogadva 23ms 4552 KiB
16 Elfogadva 30ms 5484 KiB
17 Elfogadva 28ms 5640 KiB
18 Elfogadva 21ms 4868 KiB
19 Elfogadva 21ms 5688 KiB
20 Elfogadva 28ms 5680 KiB
21 Elfogadva 3ms 4720 KiB
22 Elfogadva 3ms 4724 KiB
23 Elfogadva 3ms 4848 KiB
24 Elfogadva 3ms 4960 KiB
25 Elfogadva 3ms 4932 KiB
26 Elfogadva 3ms 4940 KiB