第三次题组 [Cloned] - Virtual Judge (vjudge.net)
【题目描述】
有一组n人。他们中的一些人可能是骗子,他们总是说谎。其他人总是说实话。这 i个人说“至少有x人是我们中间的骗子”。确定人们所说的是否矛盾,或者是否有可能。如果可能,输出组中的骗子数量。如果有多个可能的答案,请输出其中任何一个。
【输入】
第一行包含单个整数t (1≤t≤1000) — 测试用例的数量。
每个测试用例的第一行包含一个整数n (1≤n≤100).
每个测试用例的第二行包含n整数l (0≤l≤n)
保证所有的总和n不超过104.
【输出】
对于每个测试用例,输出一个整数。如果人们所说的是矛盾的,输出−1.否则,输出组中的骗子数。如果有多个可能的答案,请输出其中任何一个。
解题思路
这是一道思维题,要考虑到如果所有人答的结果是当前总人数的情况,此时所有人都在说谎。
将说谎者的数量遍历,在每个数量下找满足条件的情况(假设的数量和这个在前提下说谎的人数量相等)
最后在判断是否可以得知骗子的结果时,判断sum是否和假设的骗子数量相同,相同则输出sum,不相同输出-1.
代码如下
#include<iostream>
#include<algorithm>
using namespace std;
int a[105];
int main() {
int t, n;
cin >> t;
while (t--) {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int flag = 0;
//i是假设的有多少个人说谎
for (int i = 0; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= n; j++) {
//找出大于假设i的,用sum统计当前前提下骗子的数量
if (i < a[j]) {
sum++;
}
}
//如果sum和假设的骗子数量相同则输出
if (sum == i) {
cout << sum << endl;
flag = 1;
break;
}
}
if (flag==0) {
cout << -1 << endl;
}
}
}