[BZOJ2523][Ctsc2001]聪明的学生

试题描述

一位教授逻辑学的教授有三名非常善于推理且精于心算的学生A,B和C。有一天,教授给他们三人出了一道题:教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个。于是,每个学生都能看见贴在另外两个同学头上的整数,但却看不见自己的数。
 
这时,教授先对学生A发问了:“你能猜出自己的数吗?”A回答:“不能。”
教授又转身问学生B:“你能猜出自己的数吗?”B想了想,也回答:“不能。”
教授再问学生C同样的问题,C思考了片刻后,摇了摇头:“不能”。
接着,教授又重新问A同样的问题,再问B和C,……,经过若干轮的提问之后,当教授再次询问某人时,此人突然露出了得意的笑容,把贴在自己头上的那个数准确无误的报了出来。
 
现在,如果告诉你:教授在第N次提问时,轮到回答问题的那个人猜出了贴在自己头上的数是M,你能推断出另外两个学生的头上贴的是什么数吗?
 
[提示]
在没有人猜出自己头上的数之前,大家对教授提问的回答始终都是“不能”;而且除此之外在A,B,C之间是没有进行任何信息交流的。也就是说,每个人推断的依据仅仅是另外两个人的头上数,以及大家对教授的提问所做出的否定回答。
教授总是从学生A开始提问的。
你可以假定,这三个足够聪明的学生能够根据已知的条件在最早的轮次猜出自己的数,并且永远都不会猜错。
稍经分析和推理,你将得出以下结论:总是头上贴着最大的那个数的人最先猜出自己头上的数。

输入

包括若干组测试数据,其中的每一行代表一组测试数据,由两个整数N和M组成(即在教授第N次提问时,轮到回答问题的那个人猜出了贴在自己头上的数是M)。两个数之间用空格分隔开。最后,由-1 -1组成的一行标志着输入数据的结束。
0<N<500; 0<M<30000

输出

按照输入文件中的顺序依次给出各组数据的结果。
文件中对应每组数据的输出的第一行是一个整数p,是可能情况的总数。接下来的p行,每一行包括三个数,分别为贴在A,B,C头上的三个数。输出时,所有解按照A头上的数增序排列;在A头上的数相同的情况下,按照B头上的数增序排列。

输入示例


-  -

输出示例


数据规模及约定

见“输入

题解

我是因为喜欢这题题号才做这题的。。。

整个题面有用的话只有最后一句:“总是头上贴着最大的那个数的人最先猜出自己头上的数。”

那么对于一个局面 (x, y, x+y),不妨设 x > y,那么 x+y 那个人能猜出自己脑袋上的数当且仅当他能排除自己脑袋上的数是 x-y 的可能性。怎么排除?就是假设自己脑袋上是 x-y,那么由于他知道另外两个人的数是啥(即 x 和 y),他也知道 x > y,那么就是说 (x, y, x-y) 中最大的是 x,那么如果在轮到头上是 x 的那个人在他理应猜出来的那步时还回答不出来,就说明自己头上的数不可能是 x-y,那么就可以从 (x, y, x-y) 这个局面的答案退出 (x, y, x+y) 这个局面的答案了。

最后我们暴力枚举可能的初始状态然后用迭代代替递归,就 rank 1 了。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 30010 int nxt[4] = {0, 2, 3, 1}, pre[4] = {0, 3, 1, 2}; struct Tri {
int a, b, c;
Tri() {}
Tri(int _1, int _2, int _3): a(_1), b(_2), c(_3) {}
bool operator < (const Tri& t) const {
if(a != t.a) return a < t.a;
if(b != t.b) return b < t.b;
return c < t.c;
}
} ans[maxn]; bool check(int x, int y, int p, int n) {
while(n > 0) {
if(x == y) return n == p;
if(x > y) {
swap(x, y); y -= x; n -= 2; p = nxt[p];
}
else {
swap(x, y); x -= y; n--; p = pre[p];
}
int a[4]; a[p] = x + y; a[nxt[p]] = x; a[pre[p]] = y;
}
return 0;
} int main() {
while(1) {
int n = read(), s = read();
if(n == -1) break;
int p = n % 3 ? n % 3 : 3, cnt = 0;
for(int i = 1; i < s; i++) if(check(i, s - i, p, n)) {
int a[4]; a[p] = s; a[nxt[p]] = i; a[pre[p]] = s - i;
ans[++cnt] = Tri(a[1], a[2], a[3]);
}
sort(ans + 1, ans + cnt + 1);
printf("%d\n", cnt);
for(int i = 1; i <= cnt; i++) printf("%d %d %d\n", ans[i].a, ans[i].b, ans[i].c);
} return 0;
}

[BZOJ2523][Ctsc2001]聪明的学生的更多相关文章

  1. BZOJ2523/LOJ2646 聪明的学生

    BZOJ2523/LOJ2646 聪明的学生 第一道CTSC的题. 因为是思维题,所以思路就不写了.直接看代码吧. #include<bits/stdc++.h> #define M 30 ...

  2. 【bzoj2523】【CTSC2001】聪明的学生

    真是神仙题,做完后感觉智商提(jiang)升(di)了 这种题一般都是把局面设成状态,然后发现可以由一种状态转移到另一种状态,那就是 $dp$ 了. 但是这道题怎么设呢? 题目中给了你一个结论,一般题 ...

  3. bzoj2523 聪明的学生

    bzoj第一题,ctsc2001. 黑书上的递归例题,我们定义time()函数,递归求解即可. 这个题用到了一个小技巧:可以使用枚举来搞算法. #include <iostream> #i ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. BZOJ 刷题总结(持续更新)

    本篇博客按照题号排序(带*为推荐题目) 1008 [HNOI2008]越狱 很经典的题了..龟速乘,龟速幂裸题,, 1010 [HNOI2008]玩具装箱toy* 斜率优化 基本算是裸题. 1012 ...

  6. *HDU1847 博弈

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. 探索性思维——How to Solve It

    我觉得这篇文章和什么都能扯上点关系,比如编程. 很多人已经讨论过数学与编程的关系了,这里不想过多探讨,只是简单提一下:有些人把数学贬低地一文不值,认为做一般的应用软件用不到数学:而有些人则把数学拔高到 ...

  8. [转] ACM中国国家集训队论文集目录(1999-2009)

    国家集训队1999论文集 陈宏:<数据结构的选择与算法效率——从IOI98试题PICTURE谈起>来煜坤:<把握本质,灵活运用——动态规划的深入探讨>齐鑫:<搜索方法中的 ...

  9. 【原创】我是怎么从零开始教女同学进行php开发的(4)

    周末给自己放了一个小假,周五晚上跟同学出去吃饭,周六又休息了一天,直到周日才坐到电脑前面码字. 本来说好周末这两天把之前三篇的代码根据评论中的建议好好修改一下的,顺便认真系统地学习一遍HTML基础.结 ...

随机推荐

  1. VS2010每次编译都重新编译 解决方案

    今天用VS2010的时候遇到这个问题,总搞不定,关掉重启各种尝试都木有用,最后突然发现项目的生成时间总是2009年...好吧,原来刚才笔记本死机了,我把笔记本拆了,拔下电池,擦了擦内存条,导致系统时间 ...

  2. phantomas参数选项

    PhantomJS-based web performance metrics collector phantomas <url> [options] General options: - ...

  3. sysbench0.5安装介绍

    sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况,sysbench支持MySQL.PostgreSQL.Oracle数据库OLTP测试.它 ...

  4. SQLServer查询耗时sql语句

    qs.total_worker_time/qs.execution_count as [Avg CPU Time], , ( ) as query_text, qt.dbid, dbname=db_n ...

  5. httpmodule初识

    .net的请求流程: HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE- ...

  6. ping 不通。无法访问目标主机

    台式机 使用无线网卡  又登录了VPN 有时候访问不了局域网内的主机 解决方案  添加路由即可 window+R 打开运行 输入cmd  然后输入 route add 10.16.1.89 10.13 ...

  7. nyoj-47-过河问题|POJ-1700-Crossing River

    http://acm.nyist.net/JudgeOnline/problem.php?pid=47 http://poj.org/problem?id=1700 解题思路:求最少需要多少时间才能都 ...

  8. css--float浮动

    前戏 前面我们学习了CSS相关的知识,现在试想一下,如果我们想把两个div放在一行显示,该怎么处理?前面也说过,div是块级标签,默认占一行,这时候如果想要达成效果,那就要用到float了 float ...

  9. js parse_url 引发的

    原文链接:https://www.w3.org/TR/2011/WD-html5-20110525/origin-0.html 这里只是做下记录: 5.3 Origin — HTML5 li, dd ...

  10. 多数据源连接Oracle报错,linux熵池耗尽问题

    最近碰到了个很有意思的问题,springboot加载多数据源,遇到了在启动时数据库连接报错的问题. 报错信息: The error occurred while executing a query 然 ...