3241: 奇怪的比赛

3241: 奇怪的比赛

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 14  Solved: 9
[ Submit][ Status][ Web Board]

Description

某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

   
每位选手需要回答10个问题(其编号为110),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

   
每位选手都有一个起步的分数为10分。

   
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

   
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有10的串来表示。例如:0010110011就是可能的情况。

   
你的任务是算出所有可能情况。每个答案占一行。(将每一个答案看成二进制数,答案由大到小排列)

Input

Output

...

...

0010110011

HINT

Source

曹令鑫

注:

采用递归的做法。

分数是从10开始的,每一道题目我们并不知道哪一道做的对或者错,所以我把每一道题目都置为错误的(grades[10]数组的初值均为0),text函数为递归函数(传的值分别为分数和grades数组的下标),grades数组中每一道题目又两种情况(对或者错),对的话,数组中的值就改为1,对应的分数就做加倍操作,数组下标加1(vis同时也代表当前是第几道题目);错误,就把当前数组中的值,置为0,把当前分数减去当前题目数(扣掉与题号相同的分数),题目数继续加1.

函数上方的if语句是递归出口,当成绩不满足条件或者题目数超过10个时,就继续进行下面的if语句判断(判断当前分数是否为100,如果为100,就把grades数组中的一串数字输出),否则就return 0 退出函数。

最后结果为:

1011010000
0111010000
0010110011

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std; 
int grades[10]={0};
void text(int score,int vis){
	int i;
	if(score<=0||vis>=11){//递归出口 
		if(score==100){//满足成绩为100,就输出
		  for(i=1;i<=10;i++){ 
		    cout<<grades[i];
		    } 
		     cout<<endl;
	    }
		   return ;//不满足就退出函数
	 }
	grades[vis]=1;//第一种情况,答对题目
	text(2*score,vis+1);//成绩加倍,下标加1
	grades[vis]=0;//第二种情况,答错题目
	text(score-(vis),vis+1);//成绩扣掉与题号相同的分数,题目数继续加1 ;
}
int main(){
	text(10,1);
	return 0;
} 


### 关于蓝桥杯比赛中的“奇怪的捐赠”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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值