【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; }