ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[BZOJ 2523][Ctsc2001]聪明的学生(递归)

2021-06-11 10:55:48  阅读:238  来源: 互联网

标签:教授 cnt 2523 int work 头上 Ans Ctsc2001 BZOJ


Description

一位教授逻辑学的教授有三名非常善于推理且精于心算的学生A,B和C。有一天,教授给他们三人出了一道题:教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个。于是,每个学生都能看见贴在另外两个同学头上的整数,但却看不见自己的数。

这时,教授先对学生A发问了:“你能猜出自己的数吗?”A回答:“不能。”

教授又转身问学生B:“你能猜出自己的数吗?”B想了想,也回答:“不能。”

教授再问学生C同样的问题,C思考了片刻后,摇了摇头:“不能”。

接着,教授又重新问A同样的问题,再问B和C,……,经过若干轮的提问之后,当教授再次询问某人时,此人突然露出了得意的笑容,把贴在自己头上的那个数准确无误的报了出来。

现在,如果告诉你:教授在第N次提问时,轮到回答问题的那个人猜出了贴在自己头上的数是M,你能推断出另外两个学生的头上贴的是什么数吗?

[提示]

在没有人猜出自己头上的数之前,大家对教授提问的回答始终都是“不能”;而且除此之外在A,B,C之间是没有进行任何信息交流的。也就是说,每个人推断的依据仅仅是另外两个人的头上数,以及大家对教授的提问所做出的否定回答。

教授总是从学生A开始提问的。

你可以假定,这三个足够聪明的学生能够根据已知的条件在最早的轮次猜出自己的数,并且永远都不会猜错。

稍经分析和推理,你将得出以下结论:总是头上贴着最大的那个数的人最先猜出自己头上的数。

Solution

神奇的猜数问题

我们首先需要知道最大的数是怎么被猜出来的

1.当一个人看到另两个人的数字一样时,肯定可以推断自己头上的数是他们的和

2.一个人看到另两个人头上的数分别为x,y 则自己只可能是x+y或|x-y|;某种情况下,假设自己头上是|x-y|其他的人就已经可以推断出来自己的数,则说明自己不可能是|x-y|,所以猜到自己头上是x+y

已经知道了最大的数,于是说就枚举另两个数的可能,并判断猜的次数是不是n

work(int x,int y,int t) 表示在位置t的人看到下一个人是x,再下一个人是y,递归计算需要猜多少次

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m,k,cnt,Out[3][10000],Ans,a,b,c;
int work(int x,int y,int z,int t,int sum)
{
	if (sum>n) return 100;
	if (t==0) t=3;
	if (y==z) return t;
	return work(y,z,abs(y-z),t-1,sum+1)+1;
}
void doit(int x,int y,int z)
{
	if (k==1) Ans=work(x,z,y,1,0);
	else if (k==2) Ans=work(x,y,z,2,0);
	else Ans=work(x,z,y,3,0);
	if (Ans==n) 
	{
		cnt++;Out[a][cnt]=x;Out[b][cnt]=y;Out[c][cnt]=z;
	}
}
int main()
{
	while(scanf("%d%d",&n,&m)&&m!=-1)
	{
		k=n%3;cnt=0;
		if (k==1) a=0,b=1,c=2;
		else if (k==2) a=1,b=0,c=2;
		else a=2,b=0,c=1;
		for (int i=1;i<m;i++)
			doit(m,i,m-i);
		printf("%d\n",cnt);
		for (int i=1;i<=cnt;i++) printf("%d %d %d\n",Out[0][i],Out[1][i],Out[2][i]);
	}
}
 

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

标签:教授,cnt,2523,int,work,头上,Ans,Ctsc2001,BZOJ
来源: https://blog.51cto.com/u_14013325/2895796

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有