P1618三连击 (暴力+枚举)
P1618 三连击升级版题目描述将1,2,…,91, 2,\ldots, 91,2,…,9共999个数分成三组分别组成三个三位数且使这三个三位数的比例是A:B:CA:B:CA:B:C试求出所有满足条件的三个三位数若无解输出No!!!。输入格式三个数A,B,CA,B,CA,B,C。输出格式若干行每行333个数字。按照每行第一个数字升序排列。输入输出样例 #1输入 #11 2 3输出 #1192 384 576 219 438 657 273 546 819 327 654 981说明/提示保证0≤ABC≤9990 \le ABC \le 9990≤ABC≤999。upd 2022.8.3\text{upd 2022.8.3}upd 2022.8.3新增加二组 Hack 数据。【题解】核心思想根据输入的比例 A:B:C枚举倍数 i 生成三个三位数判断这三个数是否恰好由数字 1∼9 不重复、不遗漏组成。具体步骤输入与特判读入三个整数 A,B,C。若其中存在 0直接判定无解。枚举倍数生成数字枚举正整数 i计算 xAi, yBi, zC*i。若任意数字超过 999停止枚举。若任意数字不足 100跳过当前情况。数字合法性判断将 x,y,z 转为字符串并拼接成一个 9 位字符串。对字符串整体排序。若排序结果等于 “123456789”说明恰好使用 1∼9 各一次为合法答案。输出结果按顺序输出所有合法解。若无任何解输出 No!!!。关键技巧利用字符串拼接 排序简洁判断数字 1∼9 是否全部出现且不重复。利用比例关系 x:y:zA:B:C避免浮点运算保证精度与效率。#includebits/stdc.husingnamespacestd;inta,b,c,flag0;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);cinabc;if(a0||b0||c0){coutNo!!!\n;return0;}for(inti1;;i){intxa*i,yb*i,zc*i;if(x987||y987||z987)break;if(x123||y123||z123)continue;string sto_string(x)to_string(y)to_string(z);sort(s.begin(),s.end());if(s123456789){flag1;coutx y zendl;}}if(!flag)coutNo!!!endl;return0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2521414.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!