【洛谷】P1618 三连击(升级版)(next_permutation函数的运用)题解
原题地址:https://www.luogu.org/problemnew/show/P1618
题目背景
三连击(升级版)
题目描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
//感谢黄小U饮品完善题意
输入输出格式
输入格式:
三个数,A B C。
输出格式:
若干行,每行3个数字。按照每行第一个数字升序排列。
输入输出样例
输入样例#1:
1 2 3
输出样例#1:
192 384 576
219 438 657
273 546 819
327 654 981
说明
时空限制: 1000ms/128MB
思路:
从这道题学到了STL中的next_permutation函数,其作用是提供当前排列的下一个排列。
同时,prev_permutation函数其作用是提供当前排列的上一个排列。
推荐两篇不错的博客/博客园:
【用法总结】C++ STL中 next_permutation函数的用法
C++STL中函数next_permutation的使用
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int a,b,c,count=0;
int p[10]={0,1,2,3,4,5,6,7,8,9};
scanf("%d%d%d",&a,&b,&c);
int sum=a*b*c; //之所以这样写,为了下面判断是否符合比例可以直接用乘法
a=sum/a;
b=sum/b;
c=sum/c;
do{
//如果符合其比例
if((100*p[1]+10*p[2]+p[3])*a==(100*p[4]+10*p[5]+p[6])*b&&(100*p[1]+10*p[2]+p[3])*a==(100*p[7]+10*p[8]+p[9])*c)
{
printf("%d%d%d %d%d%d %d%d%d\n",p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9]);
count++;
}
}while(next_permutation(p+1,p+10)); //STL中的下一个排列函数
if(count==0)
printf("No!!!");
return 0;
}