J - Trust Nobody

该问题是一个逻辑推理题,给定一组人,其中一些人总是说谎,一些人总是说实话。程序需判断他们关于骗子数量的陈述是否存在矛盾,并找出可能的骗子数量。通过遍历所有可能的骗子数量,检查是否与陈述相符,输出可能的解或-1表示矛盾。
摘要由CSDN通过智能技术生成

第三次题组 [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;
		}
		

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明里灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值