1301: [蓝桥杯2016决赛]随意组合 【简单 /全排列 / 思维】

这篇博客探讨了全排列的概念,并通过C++代码展示了如何找到两个数字序列中满足特定条件(如特定数字在特定位置)的所有配对。简化后的代码表明,只需对一个序列进行排列,另一个序列保持不变即可避免重复计算,从而有效地计算出符合条件的组合总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
http://oj.ecustacm.cn/problem.php?id=1301

全部全排列
在这里插入图片描述
记得排除重复的。4x3x2x1=24。
所以最后的结果要除以24.

#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int a[8]={1,2,3,4,5,6,7,8};
int main(void)
{
	int n=0;
	ll sum1,sum2;
	do
	{
		bool flag1=false;
		bool flag2=false;
		bool flag3=false;
		bool flag4=false;
		sum1=pow(a[0]*10+a[1],2)+pow(a[2]*10+a[3],2)+pow(a[4]*10+a[5],2)+pow(a[6]*10+a[7],2);
		sum2=pow(a[0]+a[1]*10,2)+pow(a[2]+a[3]*10,2)+pow(a[4]+a[5]*10,2)+pow(a[6]+a[7]*10,2);
		if(a[0]==8||a[2]==8||a[4]==8||a[6]==8)//判断位置对不对
			flag1=true;
		if(a[0]==5||a[2]==5||a[4]==5||a[6]==5)
			flag2=true;
		if(a[0]==3||a[2]==3||a[4]==3||a[6]==3)
			flag3=true;
		if(a[0]==2||a[2]==2||a[4]==2||a[6]==2)
			flag4=true;
		if(flag1&&flag2&&flag3&&flag4)
		{
			if(sum1==sum2)
			{
				n++;
			}
		}
	}while(next_permutation(a,a+8));
	printf("%d\n",n/24);
	return 0;
}

简单写法:
你经过思考会发现。只需一个袋子排列,另一个袋子不变就可以了。
这样就自动排除重复的了。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[4]={2,3,5,8};
    int b[4]={1,4,6,7};
    int x,y,ans=0;
    do
    {
        int a1=a[0]*10+b[0],b1=b[0]*10+a[0];
        int a2=a[1]*10+b[1],b2=b[1]*10+a[1];
        int a3=a[2]*10+b[2],b3=b[2]*10+a[2];
        int a4=a[3]*10+b[3],b4=b[3]*10+a[3];
        x=a1*a1+a2*a2+a3*a3+a4*a4;
        y=b1*b1+b2*b2+b3*b3+b4*b4;
        if(x==y)
            ans++;
    }while(next_permutation(a,a+4));
    cout<<ans<<endl;
    return 0;
}
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int a[4]={2,3,5,8};
int ans;
int main(void)
{
	do
	{
		int sum1=pow(a[0]*10+1,2)+pow(a[1]*10+4,2)+pow(a[2]*10+6,2)+pow(a[3]*10+7,2);
		int sum2=pow(a[0]+10*1,2)+pow(a[1]+10*4,2)+pow(a[2]+10*6,2)+pow(a[3]+10*7,2);
		if(sum1==sum2) ans++; 
	}while(next_permutation(a,a+4));
	cout<<ans<<endl;
	return 0;
}

最简单的写法:
题目里是有隐藏的彩蛋的。
在这里插入图片描述
题目给了信息,随便排列都可以。
说明从一个袋子里取和另一个袋子匹配的 任意一个组合都是正确的。

2第一个选可以2号袋子里的4个任意匹配 4种情况。
3第二个选可以2号袋子里的3个任意匹配 3种情况。(因为上一步已经取了1个)
5第三个选可以2号袋子里的2个任意匹配 2种情况。
8第四个选可以2号袋子里的1个任意匹配 1种情况。
那么答案 就是 4x3x2x1。

所以直接得结果24。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值