Prince and Princess

这篇博客讨论了一个问题:在A个好人,B个坏人和C个路人中,如何通过询问最少次数找到公主。策略是让好人的回答比坏人的多一个,因此当A大于B+C时,询问B+C+1次即可。特殊情况是当A=1,B=0,C=0时,意味着只有一个好人,即公主,此时无需询问。博客忽略了前两个问题,因为它们无法提供有效信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:https://nanti.jisuanke.com/t/42402
思路:

  1. 理解题意:有A个好人,B个坏人,C个路人,题目考虑的是最坏情况,所以就是A个好人,B+C个坏人。
  2. 忽略一二问题,只关注第三个问题—公主在哪个房间,只能根据他们的话来判断,所以—哪个房间号被说的多就是哪个,最坏情况就是B+C串通一气说了同一个错误的房间号,这时候就需要A比B+C多,才能够判断出来。
  3. 解决答案:王子需要问A+B+C次嘛,不需要⑧,我们做这么多的目的就是为了,让好人的答案,比坏人的答案多一个就够了,因为你已经提前知道了坏人一共有 B+C 个,所以只需要问B+C+1 个好人就够啦,所以输出的是(B+C)*2+1就好啦。
  4. 坑:需要特判一下,A=1,B=0,C=0的情况,因为如果只有一个好人的话,就是公主啦,那么只有一个房间,直接原地结婚就好啦,输出0。
  5. 为什么只看第三个问题:第一个问题,就和狼人杀一样,都是好人不能判断;第二个问题,1-n房间住着的是谁,找到公主房的话,问好人也要n次,次数明显增很多。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main(){
    int a,b,c;
    cin>>a>>b>>c;
    if(a<=(b+c)) cout<<"NO"<<endl;
    else{
        cout<<"YES"<<endl;
        if(a==1&&b==0&&c==0) cout<<"0"<<endl;
        else cout<<2*(b+c)+1<<endl;
    } 
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值