码迷,mamicode.com
首页 > 其他好文 > 详细

2019 ACM ICPC 南京站 H. Prince and Princess

时间:2019-10-27 23:03:12      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:main   lin   names   就是   代码   pre   using   情况   ++   

题意

王子想要娶公主,但是需要完成一个挑战:在一些房间中找出公主在哪。

每个房间有一个人,他们彼此知道谁在哪个房间。可以问他们三种问题:

  • 你是谁?
  • 在某个房间是谁?
  • 公主在哪个房间?

有三类人,一类一定说真话,一类一定说假话,一类可能说真话可能说假话。

王子知道这三类人的人数分别为 \(a\), \(b\), \(c\),求能否通过问一些问题找到公主在哪,如果能,输出最少需要的问题数。

思路

第三类人有可能说假话,因此最坏情况就是说假话,所以把他们视为第二类人。

首先问所有人第三个问题,那么最坏情况就是说真话的人都说出公主的位置,说假话的人都选择一个不是公主的人说他是公主。所以最后只会问到两个位置。那么只要说真话的人数量比较多,就一定能确认公主在哪个房间。否则是无法确定的。所以我一开始以为问问题的次数为 \(a + b + c\)

后来队友给了个样例,发现其实不需要问这么多,只要说真话的人比说假话的人多就行。也就是说假话的只有 \(b + c\) 个人,那么只要再问说真话的 \(b + c + 1\) 个人就可以了。

还有特殊情况,就是所有人都说真话,只要问一个人就行了。

还有更特殊的情况(队友想到的),就是 \(1 0 0\) 的情况,不需要问问题,因为那个人就是公主。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    ll a, b, c;
    cin >> a >> b >> c;
    if(b == 0 && c == 0) {
        cout << "YES" << endl;
        if(a == 1) cout << 0 << endl;
        else cout << 1 << endl;
    } else if(a > b + c) {
        cout << "YES" << endl;
        cout << (b + c) * 2 + 1 << endl;
    } else {
        cout << "NO" << endl;
    }
    return 0;
}

2019 ACM ICPC 南京站 H. Prince and Princess

标签:main   lin   names   就是   代码   pre   using   情况   ++   

原文地址:https://www.cnblogs.com/wulitaotao/p/11749342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!