其他分享
首页 > 其他分享> > 洛谷 P1618 三连击(升级版)

洛谷 P1618 三连击(升级版)

作者:互联网

这就是一篇看完题解之后写后的题解,哈哈哈哈哈哈哈

原题目传送门

题目的大概描

这个题让我们输入三个数abc,使得在三位数中(100-999)存在三个数满足我们输入的比例(例如:1:2:3的三位数有192:384:576等),并把它们全部输出出来。
这道题特别像全排列问题,把三位数从头到位生成一边,看看有没有符合我们输入的三个数的比例的三位数。因此,对于我这种新手蒟蒻,肯定会第一时间想到STL中的next_permutation函数


开局一条分割线,就问你服不服?(orz

既然是全排列,那么我们就是去排列0-9的所有数字(因为数据本身就不多,使用next_permutation的空间和时间都是够的),看看从哪些排列里面能够得到我们想要的成比例的三位数。
因为最终我们需要判断的是三位数是否成比例,那么我们就需要把这些数以我们输入的比例乘出来(例如,192:384:576,把1926=3842=576*2,以此来判断,因此我们就需要加上一行特殊的处理)。

a=tmp/a; b=tmp/b; c=tmp/c;
do{
    if((100*num[1]+10*num[2]+num[3])*a==(100*num[4]+10*num[5]+num[6])*b && (100*num[1]+10*num[2]+num[3])*a==(100*num[7]+10*num[8]+num[9])*c){
        printf("%d%d%d %d%d%d %d%d%d\n",num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
        cnt++;
    }
} while(next_permutation(num+1,num+10));

最后,如果有排列满足,那么我们就输出这个排列,让计数器++。如果计数器为0,那么就输出No!!!,即没有答案。完结撒花。

上代码

#include<bits/stdc++.h>
using namespace std;
int num[10]={0,1,2,3,4,5,6,7,8,9};
int a,b,c,tmp,cnt=0;
int main(){
    scanf("%d%d%d",&a,&b,&c);
    tmp=a*b*c;
    a=tmp/a; b=tmp/b; c=tmp/c;
    do{
        if((100*num[1]+10*num[2]+num[3])*a==(100*num[4]+10*num[5]+num[6])*b && (100*num[1]+10*num[2]+num[3])*a==(100*num[7]+10*num[8]+num[9])*c){
            printf("%d%d%d %d%d%d %d%d%d\n",num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
            cnt++;
        }
    } while(next_permutation(num+1,num+10));
    if(cnt==0) printf("No!!!\n");
    system("pause");
    return 0;
}
credits @ElevenX (Luogu)

标签:tmp,10,连击,洛谷,d%,三位数,num,P1618,100
来源: https://www.cnblogs.com/gumitube/p/15740648.html