首页 > 其他分享 >p1008三连击

p1008三连击

时间:2024-12-17 19:53:46浏览次数:4  
标签:digits 10 连击 string p1008 int 100 include

三连击


首先,第一种做法是将一个用一个向量(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;
}

标签:digits,10,连击,string,p1008,int,100,include
From: https://www.cnblogs.com/RedSenior/p/18613311

相关文章

  • 直播间互动升级:双轨道礼物托盘的展示与连击
    引言在直播间的互动场景中,礼物的托盘展示不仅是活跃氛围的重要手段,也是用户体验的关键环节。随着礼物类型的多样化,例如需要连续展示的连击礼物和一次性送出多个的数字礼物,礼物托盘的设计需要同时满足实时性、流畅性和视觉效果。为了优化礼物的展示效率,我们采用了双托盘轨道......
  • 《霍格沃茨之遗》风灵月影详尽指南:编辑生命值上限、最高连击、法术瞬间冷却
    《霍格沃茨之遗》风灵月影32项修改器怎么使用?本指南旨在帮助您安全、有效地利用这款修改器,以增强您的游戏体验,同时确保游戏乐趣和平衡性。一、下载安装1.下载地址:访问可靠的下载源下载。2.安装过程:下载完成后,通常无需安装,直接解压缩文件至任意位置。确保游戏已关闭,然......
  • CSP历年复赛题-P1008 [NOIP1998 普及组] 三连击
    原题链接:https://www.luogu.com.cn/problem/P1008题意解读:将 1,2,…,9共 9个数分成3组,分别组成3个三位数,且使这 3 个三位数构成 1:2:3的比例,枚举所有的组合即可。解题思路:设定三个数a、b、c枚举a,最小123,最大987b=a*2,c=a*3判断b、c是否是三位数,且a、b、c中所......
  • Godot.NET C#IOC重构(9-10):三连击,攻击框
    目录前言AnimationPlayer和AnimatedSprite2D将导出属性添加到关键帧里面。状态机构建核心代码完整代码实现效果碰撞框和受攻击框全局类HitBox:攻击框HurtBox:受击框实现效果添加Player攻击总结前言这篇博客来深入讲解一下Godot中的AnimationPlayerAnimationPlayer和AnimatedSpr......
  • 洛谷 P10084 [GDKOI2024 提高组] 计算
    洛谷传送门第一步是一个经典结论,\(L=m^{\gcd(a,b)}+1\),\(R=m^{\gcd(c,d)}\)。因为\(L\equiv1\pmodm\)且\(R\equiv0\pmodm\),所以可以把问题的范围改成\([1,n=R-L+1]\)。写出选数的生成函数:\[F(x)=\prod\limits_{i=1}^n(1+x^i)\]我们希望求......
  • 「洛谷」题解:P1008 三连击
    题目传送门题目背景本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。题目描述将\(1,2,\ldots,9\)共\(9\)个数分成\(3\)组,分别组成\(3\)个三位数,且使这\(3\)个三位数构成\(1:2:3\)的比例,试求出所有满足条件的......
  • P1618 三连击(升级版)
    P1618三连击(升级版)题目将\(1,2,\ldots,9\)共\(9\)个数分成三组,分别组成三个三位数,且使这三个三位数的比例是\(A:B:C\),试求出所有满足条件的三个三位数,若无解,输出No!!!。输入三个数,\(A,B,C\)。输出若干行,每行\(3\)个数字。按照每行第一个数字升序排列。样例输入......
  • 洛谷 P1008 [NOIP1998 普及组] 三连击
    这道题我们可以用桶排序来做,代码如下:#include<bits/stdc++.h>//万能头 usingnamespacestd;//好习惯 inta[10];//一个桶数组,来确定是否有重复的 intmain(){   ints1,s2,s3;//定三个函数,用于判断    intsum=0;//用于判断数字是否重复    for(int......
  • P1618 三连击(升级版)
    题目链接:#include<bits/stdc++.h>usingnamespacestd;intp[10],sum;intmain(){ intA,B,C; boolflag=false; scanf("%d%d%d",&A,&B,&C); for(inti=1;i<=999/C;i++){ memset(p,0,sizeofp); sum=0; ......
  • P10084 [GDKOI2024 提高组] 计算 题解
    题目传送门前置知识:单位根反演先考虑怎么求\(F(x,a,b)\),易得\(\gcd(x^a-1,x^b-1)=x^{\gcd(a,b)}-1\)。所以\(L=m^{\gcd(a,b)}+1,R=m^{\gcd(c,d)}\),然后发现\([L,R]\)中的数模\(m\)后每种余数出现次数相同,下面记其为\(n=\frac{R-L}{m}\)。考虑用生成函数做,易得答案为......