第七届蓝桥杯大赛个人赛决赛C/C++A组答案(除编程题)

写在前面:

    答案只代表个人观点,出错麻烦指正!

1.随意组合

小明被绑架到X星球的巫师W那里。

其时,W正在玩弄两组数据 (2 3 5 8) 和 (1 4 6 7)
他命令小明从一组数据中分别取数与另一组中的数配对,共配成4对(组中的每个数必被用到)。
小明的配法是:{(8,7),(5,6),(3,4),(2,1)}

巫师凝视片刻,突然说这个配法太棒了!

因为:
每个配对中的数字组成两位数,求平方和,无论正倒,居然相等:
87^2 + 56^2 + 34^2 + 21^2  =  12302
78^2 + 65^2 + 43^2 + 12^2  =  12302

小明想了想说:“这有什么奇怪呢,我们地球人都知道,随便配配也可以啊!”
{(8,6),(5,4),(3,1),(2,7)}

86^2 + 54^2 + 31^2 + 27^2 = 12002
68^2 + 45^2 + 13^2 + 72^2 = 12002

巫师顿时凌乱了。。。。。

请你计算一下,包括上边给出的两种配法,巫师的两组数据一共有多少种配对方案具有该特征。
配对方案计数时,不考虑配对的出现次序。
就是说:
{(8,7),(5,6),(3,4),(2,1)}
与
{(5,6),(8,7),(3,4),(2,1)}
是同一种方案。

注意:需要提交的是一个整数,不要填写任何多余内容(比如,解释说明文字等)

    答案:144

result=0
def sam(ki):
    global result
    a=0
    b=0
    for i in range(4):
        a += (ki[i][0] * 10 + ki[i][1]) ** 2
        b += (ki[i][1] * 10 + ki[i][0]) ** 2
    if a==b:
        result+=1

def sr(a,b,c):
    if len(c)==4:
        sam(c)
        return
    for i in range(len(a)):
        ap = a.copy()
        ap.pop(i)
        for j in range(len(b)):
            c.append([a[i],b[j]])
            bp=b.copy()
            bp.pop(j)
            sr(ap.copy(),bp.copy(),c.copy())
            c.pop()


aa=[2,3,5,8]
bb=[1,4,6,7]
sr(aa,bb,[])
print(result//4)

2.拼棋盘

有 8x8 和 6x6 的棋盘两块(棋盘厚度相同,单面有棋盘,背面无图案)。参见【图1.png】
组成棋盘的小格子是同样大小的正方形,黑白间错排列。

现在需要一个10x10的大棋盘,希望能通过锯开这两个棋盘,重新组合出大棋盘。

要求:
1。 拼好的大棋盘仍然保持黑白格间错的特性。
2。 两个已有的棋盘都只允许锯一锯(即锯开为两块),必须沿着小格的边沿,可以折线锯开。
3。 要尽量保证8x8棋盘的完整,也就是说,从它上边锯下的那块的面积要尽可能小。

要求提交的数据是:4块锯好的部分的面积。按从小到大排列,用空格分开。
(约定每个小格的面积为1)

比如:10 10 26 54
当然,这个不是正确答案。

请严格按要求格式提交数据,不要填写任何多余的内容(比如,说明解释等)

    答案: 8 8 28 56 (纯手动看出来的,无代码,希望有思路的大佬提供思路)

3.打靶

小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。

这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。

不同环数得分是这样设置的:
1,2,3,5,10,20,25,50

那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?

下面的程序解决了这个问题。
仔细阅读分析代码,填写划线部分缺失的内容。


#include <stdio.h>
#define N 8

void f(int ta[], int da[], int k, int ho, int bu, int sc)
{
	int i,j;
	if(ho<0 || bu<0 || sc<0) return;
	if(k==N){
		if(ho>0 || bu>0 || sc>0) return;
		for(i=0; i<N; i++){
			for(j=0; j<da[i]; j++) 
				printf("%d ", ta[i]);
		}
		printf("\n");
		return;
	}
	
	for(i=0; i<=bu; i++){
		da[k] = i;
		f(ta, da, k+1, _____________ , bu-i, sc-ta[k]*i);  //填空位置
	}
	
	da[k] = 0;
}

int main()
{
	int ta[] = {1,2,3,5,10,20,25,50};
	int da[N];
	f(ta, da, 0, 3, 6, 96);
	return 0;
}


注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。

    答案:(i>0)?ho-1:ho

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值