洛谷P1618 三连击(升级版)
作者:互联网
这个题目可是有意思的很,大致意思如下
:给出一到九排成三个三位数,然后满足A:B:C的比值,也就是说这三个三位数中都必须遍历1到9才可以,并且是升序排列,那怎么做呢?
我先给出最开始的思路(失败)
:给定二维数组甚至三维数组(拿输出阳历来看无非是一个长度为4的数组里面每个数组元素又包括三个小数组)
当然,写了半天我选择放弃,根本写不出来;
于是就有了一个很有趣的解法:
从100到999开始遍历(123~987也可),如果满足这个数取余A是0的话,就让其余两个数等于i/A*B和i/A*C(i代表这个数)
然后在满足其余两个数都在题目条件之内中,定义了九个数组用来存放这三个百位数的各个数字,然后,精彩一幕来了,
为了确保这三个百位数都可以遍历1到9,我们就采取这九个数组的和与这九个数组的乘积等于1~9的和与9!;
然后输出满足条件的i,j,k就可以了
附上代码
:
#include<bits/stdc++.h> using namespace std; int a,b,c,flag=0; int j,k; int main() { scanf("%d%d%d",&a,&b,&c); for(int i=100;i<=999;i++) { if(i%a==0) { j=i/a*b; k=i/a*c; if(j>=100&&j<=999&&k>=100&&k<=999) { int l[10],sum=0,xx=1; l[1]=i/100; l[2]=i/10%10; l[3]=i%10; l[4]=j/100; l[5]=j/10%10; l[6]=j%10; l[7]=k/100; l[8]=k/10%10; l[9]=k%10; for(int _i=1;_i<=9;_i++) { sum+=l[_i]; xx*=l[_i]; } if(sum==45&&xx==362880) { flag=1; printf("%d %d %d\n",i,j,k); } } } } if(flag==0)printf("No!!!"); return 0; }
标签:连击,洛谷,百位数,三个,int,遍历,数组,P1618,100 来源: https://www.cnblogs.com/LQS-blog/p/15862408.html