RedSenior

导航

p1008三连击

三连击


首先,第一种做法是将一个用一个向量(vector)数组里面装满1-9的所有数字,再用next_permutation进行全排列,用if条件语句筛选出符合结果的输出

点击查看代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    vector<int> digits = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    do {
        // 组成三个三位数
        int a = digits[0] * 100 + digits[1] * 10 + digits[2];
        int b = digits[3] * 100 + digits[4] * 10 + digits[5];
        int c = digits[6] * 100 + digits[7] * 10 + digits[8];
        
        // 检查是否满足 1:2:3 比例
        if (b == 2 * a && c == 3 * a) {
            cout << a << " " << b << " " << c << endl;
        }
    } while (next_permutation(digits.begin(), digits.end()));

    return 0;
}

但是这样的做法有一个坏处就是太浪费空间空间,算法的时间复杂度比较高,是数字的全排列的结果,即为O(9!)虽然不算得上高,却也有浪费,因此提出一个更好的解决方案——只对a进行全排列
再对b,c分别乘对应的倍数,转化为字符串,再用sort函数排列,与123456789的字符串比较,如果相等,则存在a,b,c,不等则相反。
经此处理之后,复杂度降为O(9*(329-123))=O(1800),远胜于前者。

点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool isValid(int a, int b, int c) {
    // 将三个数转为字符,拼接成字符串,检查是否恰好包含 1~9
    string s = to_string(a) + to_string(b) + to_string(c);
    if (s.size() != 9) return false;
    sort(s.begin(), s.end());
    return s == "123456789";
}

int main() {
    for (int a = 123; a <= 329; a++) { // a 必须是三位数,且 3a <= 999
        int b = 2 * a;
        int c = 3 * a;
        if (isValid(a, b, c)) {
            cout << a << " " << b << " " << c << endl;
        }
    }
    return 0;
}

posted on 2024-12-17 19:42  RedLouie  阅读(1)  评论(0编辑  收藏  举报