【CS Round #48 (Div. 2 only)】8 Divisible

【链接】h在这里写链接


【题意】


给你一个长度为n的数字(n<=1000)
然后让你任意组合这个数字。
使得这个数字能被8整除。
(不能出现前导0)

【题解】


只要后三位能被8整除就可以了。
则枚举最后3位是什么.
从000-999->只枚举8的倍数就可以了。
小于等于3位的情况,特殊判断一下就好。
然后剩下的数字,先放一个最小的非0数字在开头。
剩下的从小到大安排就可以了。
(可以把它放在字符串vector里面.最后排下序输出最小的就好了)

【错的次数】


0

【反思】


在这了写反思

【代码】

#include <bits/stdc++.h>
using namespace std;


string s;
int len, cnt[10], cnt1[10];
vector <string> v;
vector <int> v1;


void back() {
	for (int i = 0; i <= 9; i++) cnt[i] = cnt1[i];
}


void sp() {
	int start = 3 - len;
	if (v1[start] == 0) return;//开头不能为0


	for (int i = start; i <= 2; i++) {//只有后start位才有效.
		cnt[v1[i]]--;//数字递减。
	}


	for (int i = 0; i <= 9; i++)
		if (cnt[i] != 0) {
			back();
			return;
		}


	string ts = "";
	for (int i = start; i <= 2; i++)
		ts += (char)('0' + v1[i]);


	v.push_back(ts);
	back();
}


int main() {
	//freopen("F:\\rush.txt", "r", stdin);
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> s;
	len = s.size();
	for (int i = 0; i <= len - 1; i++) cnt[s[i] - '0']++;
	v1.resize(3);
	for (int i = 0; i <= 999; i += 8) {//枚举末3位是什么。肯定是8的倍数
		for (int j = 0; j <= 9; j++) cnt1[j] = cnt[j];//每一位的数字有多少个。


		int temp = i;
		for (int j = 2; j >= 0; j--, temp /= 10) v1[j] = temp % 10;//把这3位全都获取出来。


		if (len <= 3) {
			sp();
			continue;
		}


		bool ok = true;


		for (int j = 0; j <= 2; j++) {
			cnt[v1[j]]--;
			if (cnt[v1[j]] < 0) ok = false;
		}


		if (!ok) {
			back();
			continue;
		}


		string ts = "";
		ok = false;
		for (int j = 1; j <= 9; j++)
			if (cnt[j]) {
				ts += (char)('0' + j);
				cnt[j]--;
				ok = true;
				break;
			}
		if (!ok) {
			back(); continue;
		}
		for (int j = 0; j <= 9; j++)
			while (cnt[j] > 0) {
				cnt[j]--;
				ts += (char)('0' + j);
			}
		for (int j = 0; j <= 2; j++)
			ts += (char)('0' + v1[j]);
		v.push_back(ts);
		back();
	}
	sort(v.begin(), v.end());
	if (v.empty())
		cout << -1 << endl;
	else
		cout << v[0] << endl;
	return 0;
}


posted @ 2017-10-04 18:44  AWCXV  阅读(96)  评论(0编辑  收藏  举报