【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;
}
浙公网安备 33010602011771号