【gmoj】【暴力】【数学】 Do You Know Your ABCs?

51 篇文章 0 订阅
14 篇文章 0 订阅

【gmoj】【暴力】【数学】 Do You Know Your ABCs?

题目

在这里插入图片描述
在这里插入图片描述


解题思路

最多有七个数,分别为A,B,C,A+B,A+C,B+C,A+B+C
可发现A+(B+C)=B+(A+C)=C+(A+B)=A+B+C
枚举每个数放的位置
根据上面的规律求出七个数 必须非负且A<B<C
用数组标记去重


代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,ans,t,f[10],a[10],p[10],b[10],d[100010][4];
void dfs(int x)
{
	 if (x>n)
	 {
	 	int h=0;
	 	for (int i=1;i<=7;i++) a[i]=b[i];  //因为b要回溯,不能改变,赋值给a
	 	if (a[7]!=0) h=a[7];  
	 	   else for (int i=1;i<=3;i++)
	 	            if (a[i]!=0&&a[7-i]!=0)
	 	               h=a[7]=a[i]+a[7-i];  //得出A+B+C
	 	for (int i=1;i<=6;i++)  //根据上面的规律求
	 	    if (a[i]!=0)
	 	    {
	 	    	if (a[7-i]==0)
	 	    	   if (h-a[i]<0) return;  //保证非负
					  else a[7-i]=h-a[i];
	 	    	   else if (h-a[i]!=a[7-i]) return;
			}
		for (int i=1;i<=3;i++)  //有可能a[i]和a[7-i]都没填数
		    if (a[i]==0)
		    {
		    	if (i==1&&a[2]!=0&&a[4]!=0) a[1]=a[4]-a[2];
				if (i==1&&a[3]!=0&&a[5]!=0) a[1]=a[5]-a[3];
				if (i==2&&a[4]!=0&&a[1]!=0) a[2]=a[4]-a[1];
				if (i==2&&a[6]!=0&&a[3]!=0) a[2]=a[6]-a[3];
				if (i==3&&a[5]!=0&&a[1]!=0) a[3]=a[5]-a[1];
				if (i==3&&a[6]!=0&&a[2]!=0) a[3]=a[6]-a[2];
				a[7-i]=h-a[i];
				if (a[i]<0||a[7-i]<0) return;
			}
		if (a[1]+a[2]!=a[4]) return;
		if (a[1]+a[3]!=a[5]) return;
		if (a[2]+a[3]!=a[6]) return;  //保证这个三元组符合
		if (a[1]<=a[2]&&a[2]<=a[3])  //保证从小到大
		{ 
		   for (int i=1;i<=ans;i++)  //去重
		       if (a[1]==d[i][1]&&a[2]==d[i][2]&&a[3]==d[i][3])
		          return;
			  ans++;
			  d[ans][1]=a[1],d[ans][2]=a[2],d[ans][3]=a[3];
	    }
		return;
	 } 
	 for (int i=1;i<=7;i++) //枚举位置
	     if (!p[i])
		 {
		 	 b[i]=f[x];
		 	 p[i]=1;
		 	 dfs(x+1);
		 	 p[i]=0;
		 	 b[i]=0;
		 } 
}
int main()
{
	scanf("%d",&t);
	while (t--)
	{
		  ans=0;
		  scanf("%d",&n);
		  for (int i=1;i<=n;i++)
		      scanf("%d",&f[i]);
		  dfs(1);
		  printf("%d\n",ans);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值