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


  • 相关阅读:
    .net Dapper 学习系列(1) ---Dapper入门
    ASP.NET WebApi 学习与实践系列(2)---WebApi 路由请求的理解
    ASP.NET WebApi 学习与实践系列(1)---如何创建 WebApi
    Sqlserver 总结(2) 存储过程
    Image.Save出错 GDI 一般错误
    python导入模块的两种方式
    从1KW条数据中筛选出1W条最大的数
    C# EF更新当前实体报错 ObjectManager无法管理具有相同键值的多个对象
    微信小程序 异步请求拿数据+使用外部js库
    微信小程序入门 第一个页面搭建
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626020.html
Copyright © 2011-2022 走看看