当前位置:实例文章 » 其他实例» [文章]UVA-12118 检查员的难题 题解答案代码 算法竞赛入门经典第二版

UVA-12118 检查员的难题 题解答案代码 算法竞赛入门经典第二版

发布人:shili8 发布时间:2024-12-23 11:51 阅读次数:0

**UVA-12118 检查员的难题**

**题目描述**

检查员的难题是这样子的:有n个学生,分别代表着不同的国家。每个学生都有一张卡片,上面写着他们的名字和一个数字。检查员要找出哪些学生的卡片上的数字之和等于0。

**输入输出格式**

输入:

* n(学生人数)
* 卡片上数字的值(每行一个)

输出:

* 检查员发现的学生们的名字**题解**

这个问题可以使用哈希表来解决。我们先将所有卡片上的数字存入哈希表中,然后遍历哈希表,找出哪些数字之和等于0。

cpp#include <iostream>
#include <map>

using namespace std;

int main() {
 int n;
 cin >> n;
 map<int, int> mp;
 for (int i =1; i <= n; ++i) {
 int x;
 cin >> x;
 if (mp.find(x) != mp.end()) {
 mp[x]++;
 } else {
 mp[x] =1;
 }
 }

 bool flag = false;
 for (auto it = mp.begin(); it != mp.end(); ++it) {
 int sum =0;
 for (int j = -100; j <=100; ++j) {
 if (mp.find(j + it->first) != mp.end()) {
 sum += mp[j + it->first];
 }
 }

 if (sum == n && !flag) {
 flag = true;
 cout << "YES" << endl;
 for (auto it2 = mp.begin(); it2 != mp.end(); ++it2) {
 int x =0;
 for (int j = -100; j <=100; ++j) {
 if (mp.find(j + it->first) != mp.end()) {
 x += j * mp[j + it->first];
 }
 }

 if (x ==0) {
 cout << it2->second << " ";
 }
 }
 }
 }

 return0;
}


**算法**

1. 将所有卡片上的数字存入哈希表中。
2. 遍历哈希表,找出哪些数字之和等于0。

**时间复杂度**

O(n)

**空间复杂度**

O(n)

**注意事项**

* 这个问题需要使用哈希表来解决。
* 需要遍历哈希表找到哪些数字之和等于0。

相关标签:算法
其他信息

其他资源

Top