奇怪的比赛--蓝桥杯

欢迎访问我的新博客:http://www.milkcu.com/blog/

原文地址:http://www.milkcu.com/blog/archives/1366853640.html

简述

这是2012年蓝桥杯全国软件大赛预赛(C++本科组)的第4题,情景是一个计分规则奇怪的比赛,问题是已知总分得到每题的回答情况。

推荐链接:《2012蓝桥杯软件大赛预赛题目汇总》

题目描述

    某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
    每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
    每位选手都有一个起步的分数为10分。
    某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
    如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
    你的任务是算出所有可能情况。每个答案占一行。
    答案写在“解答.txt”中,不要写在这里!

分析

这个题也是使用穷举法,但是穷举的是每题的答题情况,使用十六进制可以较好的实现。对于分数的计算,使用的是与一个分数数组的与运算。

源代码

# include <stdio.h>
int main(void)
{
	int i, j;
	int comp[10] = {0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};
	int grade;
	int out[10];
	
	for(i = 0x0; i < 0x400; i++){
		grade = 10;
		for(j = 0; j < 10; j++){
			out[j] = 0;
			if(i & comp[j]){
				grade <<= 1;
				out[j] = 1;
			} else{
				grade -= j + 1;
				out[j] = 0;
			}
		}
		
		if(grade == 100){
			for(j = 0; j < 10; j++){
				printf("%d", out[j]);
			}
			putchar('\n');
		}
	}
}

最后答案

0010110011
0111010000
1011010000

### 关于蓝桥杯比赛中的“奇怪的捐赠”Java编程问题 #### 问题描述 题目要求将100万份礼物按照特定规则分配给若干个人,每个人获得的数量必须是7的不同幂次方数。目标是找出总共有多少人能够收到礼物。 #### 解题思路分析 对于这个问题,一种高效的方法是通过将总数转换为七进制来解决。因为任何正整数都可以唯一地表示为其各个位上的基数乘以其权重之和的形式,在这里就是每一位上7的幂次相加的结果[^3]。 具体来说,当把一个十进制数转成七进制时,实际上就是在寻找该数值由哪些7的幂组成的过程。每次取模运算得到的是当前最低位的系数,而除法运算是为了去掉已经处理过的低位部分以便继续处理更高一位。最终累加所有的余数即得到了所需的人数。 这种方法不仅简单而且效率高,时间复杂度仅为O(log₇n),其中n是要分解的目标金额(本题中固定为100万)。此方法避免了暴力枚举可能带来的性能瓶颈以及复杂的逻辑判断。 #### Java代码实现 下面给出基于上述思路的一个简洁版本: ```java import java.util.*; public class Main { public static void main(String[] args) { int totalGifts = 1_000_000; int peopleCount = 0; while (totalGifts > 0){ // 计算并累积每一轮剩余礼品数量对7取模后的结果 peopleCount += totalGifts % 7; // 更新剩余未分配的礼品总量 totalGifts /= 7; } System.out.println("总共有人数:" + peopleCount); } } ``` 这段程序实现了将指定数额(这里是100万)转化为其对应的7进制表达形式,并统计所有非零位置上的数字作为答案输出[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值