zoukankan      html  css  js  c++  java
  • 【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;
    }


  • 相关阅读:
    [每日一题系列] LeetCode 1071. 字符串的最大公因子
    [每日一题系列] LeetCode 1013. 将数组分成和相等的三个部分
    git diff (19)
    WinDbg探究CLR底层(1)
    使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
    转MySQL遇到的语法差异及解决方案
    批量拼脚本神器-NimbleText
    Visual Studio 2017中使用正则修改部分内容
    如何使用ILAsm与ILDasm修改.Net exe(dll)文件
    在Windows上安装Elasticsearch v5.4.2
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626020.html
Copyright © 2011-2022 走看看