跳转至

洛谷-P1008 三连击(桶排序)

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。

输入格式

木有输入

输出格式

若干行,每行33个数字。按照每行第11个数字升序排列。

输入输出样例

输入 #1

输出 #1

192 384 576
* * *
...

* * *
(输出被和谐了)

#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <climits>
#include <cstdlib>
#include <cstdio>

using namespace std;

vector<int> d(10);

void split(int n)
{
    while (n != 0) {
        ++d[n % 10];
        n /= 10;
    }
}

bool check(int a, int b, int c)
{
    split(a); split(b); split(c);
    for (int i = 1; i <= 9; ++i) {
        if (d[i] != 1) {
            return false;
        }
    }

    return true;
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    for (int i = 456; i <= 987; ++i) {
        if (i % 3 == 0) {
            int num1 = i / 3;
            int num2 = num1 * 2;
            if (check(num1, num2, i)) {
                cout << num1 << " " << num2 << " " << i << endl;
            }
            fill(d.begin(), d.end(), 0);
        }
    }

    return 0;
}

逐个枚举肯定不是什么好策略,可以考察最小的各个位上互不相同的数字是456,因为最小的三位互不相同的数是123,它的3倍是369,但是3已经被用过了,所以第一位必须是4,因为1234都被用了,所以后面只能是5和6.最大的三位互不相同的是987,很容易理解。

另外,记得只要每次check,就必须初始化桶。