19南京区域赛 H题(思维)

19南京区域赛 H题(思维)

本题参考的大佬的简书链接:
https://www.jianshu.com/p/2f27315f10d8

题目大意:王子求婚公主,但皇后想阻拦。宫中有三种群体,公主为首
赞成婚礼的,皇后为首不赞成婚礼的,毫不关心的吃瓜路人。这三种人
分别有a,b,c个,并且每个人都在独立的房间,都知道自己在哪,也
知道别人在哪。且王子知道三类人的数量。这些人分别待在各自
的房间,王子可以向房间内的人提以下三种问题
1)你是谁
2)在X房间内的人是谁
3)公主在哪个房间
所有人都会回答问题,但赞成婚礼的人会提供正确的答案,不赞成的
人会提供错误的答案,吃瓜路人的答案可能正确可能错误。问现在王
子至少要问几个问题就能确保找到公主所在的房间,如果永远不能则
输出NO.

1.理解题中的隐含意义

(1)王子会通过问问题来推理出公主在哪,所以不赞成的人会回答错误答案来打乱王子的思路,让王子分不清谁是对的谁是错的。
(2)吃瓜路人的回答具有随机性。要确保王子找到公主,那么就要考虑最坏的情况,即把吃瓜路人等价于不赞成的人。

2.分情况讨论

由上述第(2)条可得,我们要把吃瓜路人和不赞成的人并为一类。那么此时 我们就把这两类人统称为坏人
(1)若为 1 0 0 (容易忽略的情况)
王子知道每一类人有多少个,这种情况是只有公主一个人。所以。。。还问啥啊,直接抱走啊 (✧◡✧)
(2)若 a=b+c
即赞成的人=坏人
首先赞成的人肯定回答都是一样的,即
问 公主在哪个房间 他们都会回答 在y房间,那么我们会得到a个答案1。
那么这时候,捣乱小分队上线了,嘿嘿嘿 ๑乛◡乛๑
怎么才能阻止王子找到公主呢,只需要坏人统一回答一个错误答案,那么我们会得到(b+c)个答案2。此时,a=(b+c),两个答案个数相同,那么王子就判断不出来谁真谁假了。
(3)若a>b+c
即赞成的人比坏人多。
先考虑最坏情况,即我们一开始询问的都是坏人。即我们问了(b+c)个坏人。此时所有的坏人都问完了,剩下的没问的人都是赞成的人。这时我们再问(b+c)个人(这些都是赞成的人了),那么结果和情况(2)是相同的,我们会得到(b+c)个答案1和(b+c)个答案2。此时只需要再问一个人,就会得到(b+c+1)个答案1和(b+c)个答案2。那么答案1的个数大于答案二的个数,王子就能判断出答案1是正确答案,就可以找到公主。
所以至少我们要问2*(b+c)+1次。

王子知道赞成的人多且赞成的人都会说真话,那么回答的最多的答案,就是正确的。
(4)若a<b+c
即赞成的人小于坏人。
那么b+c=x*a+y。即把坏人拆分成x个和赞成的人人数相同的集体,最后可能会余下y个人(0<=y<a)。那么这x个集体只要回答不同的答案。那么王子肯定会得到与正确答案个数相同的错误答案,那么就又转到了情况(2),王子就不能判断了
王子说:我太难了**(;´༎ຶД༎ຶ`)**

3.代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int a,b,c,d;
    cin>>a>>c>>d;
    b=c+d;
    if(a==1&&b==0)cout<<"YES"<<endl<<'0';
    else
    {
        if(a==b)cout<<"NO";
        else if(a>b)cout<<"YES"<<endl<<2*b+1;
        else cout<<"NO";
    }
    return 0;
}

发布了17 篇原创文章 · 获赞 0 · 访问量 182

猜你喜欢

转载自blog.csdn.net/weixin_45719073/article/details/103334027
今日推荐