第三届蓝桥杯初赛四之奇怪的比赛法四

第三题比酒量:



    有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。


    等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”


    请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。


    如果有多个可能的答案,请列出所有答案,每个答案占一行。


    格式是:人数,人数,...


    例如,有一种可能是:20,5,4,2,0


    答案写在“解答.txt”中,不要写在这里!

#include <iostream>
using namespace std;

int main()
{
	int a,b,c,d;
	for (a=20;a>=4;a--)
	{
		for (b=a-1;b>=3;b--)
		{
			for (c=b-1;c>=2;c--)
			{
				for (d=c-1;d>=1;d--)
				{
					if ( 1.0/a+1.0/b+1.0/c+1.0/d == 1)
						printf("%d,%d,%d,%d,0\n",a,b,c,d);
				}
			}
		}
	}
}

第四题奇怪的比赛:



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


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


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


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


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


    你的任务是算出所有可能情况。每个答案占一行。


    答案写在“解答.txt”中,不要写在这里!

/*法1:纯暴力解决
include<math.h>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    int a,b,c,d,e,f,g,h,i,j;
    for(a=0; a<2; a++)
        for(b=0; b<2; b++)
            for(c=0; c<2; c++)
                for(d=0; d<2; d++)
                    for(e=0; e<2; e++)
                        for(f=0; f<2; f++)
                            for(g=0; g<2; g++)
                                for(h=0; h<2; h++)
                                    for(i=0; i<2; i++)
                                        for(j=0; j<2; j++)
                                        {
                                            score=10;
                                            a==0?score-1:score*2;
                                            b==0?score-2:score*2;
                                            c==0?score-3:score*2;
                                            d==0?score-4:score*2;
                                            e==0?score-5:score*2;
                                            f==0?score-6:score*2;
                                            g==0?score-7:score*2;
                                            h==0?score-8:score*2;
                                            i==0?score-9:score*2;
                                            j==0?score-10:score*2;
                                        }
    if(score==100)
        cout<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<endl;
    return 0;

}

*/
/*法二:递归
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int s[10];
void fun(int i,int score)
{
    if(i==10)
    {
        if(score==100)
        {
            for(int j=0; j<10; j++)
                printf("%d",s[j]);
            printf("\n");
        }
    }
    else
    {
        s[i]=0;//第n题错误的情况下
        fun(i+1,score-i-1);
        s[i]=1;//第n题正确的情况下
        fun(i+1,2*score);
    }

}
int main()
{
    memset(s,0,sizeof(s));
    fun(0,10);
}

*/
/*法三:字符串
#include <iostream>
#include<cstdio>
using namespace std;
void  f(char s[],int n,int sum)
{
    if(n==10)
    {
        if(sum==100)
            puts(s);
    }
    else
    {
        s[n]='0';
        f(s,n+1,sum-n-1);
        s[n]='1';
        f(s,n+1,sum*2);
    }
}


int main()
{
    char a[10];
    a[10]='\0';
    f(a,0,10);
    return 0;
}
*/

/*法四:进制转换
///十进制转化成二进制
#include<math.h>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    int i,j,k,score;
    int s[10];
    for(i=0; i<=pow(2,10); ++i)
    {
        score=10;
        k=i;
        for(j=0; j<=9; j++)
        {
            s[j]=k%2;
            k=k/2;
        }
        for(j=9; j>=0; --j)
            if(s[j])
                score*=2;
            else score-=10-j;
        if(score==100)
        {
            for(j=9; j>=0; --j)
                printf("%d",s[j]);
            printf("\n");
        }
    }
}















截图:

总结:不是0就是1可以用int 型,可以用char 型

a[10]='\0';意思是字符串结束符
还有进制转换



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值