#include <iostream> #include <vector> #include <unordered_map> int main() { int n, m; std::cin >> n >> m; std::unordered_map<int, std::vector<int>> queueMap; for (int i = 1; i <= n; i++) { queueMap[i] = {i}; } while (m--) { int i, j; std::cin >> i >> j; queueMap[i].insert(queueMap[i].end(), queueMap[j].begin(), queueMap[j].end()); for (unsigned int k = 0; k < queueMap[j].size(); k++) { queueMap[queueMap[j][k]] = queueMap[i]; } } std::cout << queueMap.size() << std::endl; for (auto it = queueMap.begin(); it != queueMap.end(); it++) { for (auto student : it->second) { std::cout << student << " "; } std::cout << std::endl; } return 0; }
时间: 2024-04-18 17:31:07 浏览: 21
这段代码是一个队列合并的实现。首先,从输入中读取n和m,分别表示队列的数量和操作的次数。然后,创建一个unordered_map来存储队列的映射关系,其中键是队列的编号,值是一个vector,表示队列中的元素。
接下来,使用一个循环将每个队列初始化为只包含自己。然后,对于每个操作,从输入中读取i和j,表示要合并的两个队列的编号。
将队列j的元素插入到队列i的末尾,并且更新所有被合并队列的映射。具体地说,将队列j中的每个元素在映射中更新为队列i。
最后,输出合并后的队列数量,并按照顺序输出每个队列的元素。
请注意,此代码未处理输入错误或无效的情况。在实际使用中,可能需要添加一些错误处理机制。
相关问题
#include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; vector<float> findStonePairs(const vector<float> &stones, float D) { vector<vector<float>> result; unordered_map<float, int> map; for (int i = 0; i < stones.size(); i++) { float target1 = stones[i] - D; if (map.count(target1)) { return vector<float>{target1, stones[i]}; // weight // result.push_back(vector<float>{target1, stones[i]}); // weight } float target2 = stones[i] + D; if (map.count(target2)) { return vector<float>{target2, stones[i]}; // weight // result.push_back(vector<float>{target2, stones[i]}); // weight } map[stones[i]] = i; } return vector<float>{-1, -1}; } int main() { float d = 5.0; vector<float> weights_test1 = {1.3, 3.2, 6.3, 4, 6, 5}; vector<float> result_test1 = findStonePairs(weights_test1, d); cout << "test1:" << endl; for (auto x : result_test1) { cout << x << " "; cout << endl; } return 1; }为什么输出与预期不同
你的输出与预期不同,可能是由于代码中的问题导致的。我看到你的代码中有两个问题:
1. 当找到第一组符合条件的石头对时,你直接返回一个vector,而不是将这个vector加入到result中。这意味着函数只返回一对石头,而不是所有符合条件的石头对。
2. 你的输出语句被放在了错误的位置,导致输出的格式不正确。你应该在for循环外面输出换行符,而不是在循环内部。
下面是修改后的代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
vector<vector<float>> findStonePairs(const vector<float> &stones, float D) {
vector<vector<float>> result;
unordered_map<float, int> map;
for (int i = 0; i < stones.size(); i++)
{
float target1 = stones[i] - D;
if (map.count(target1))
{
result.push_back(vector<float>{target1, stones[i]}); // weight
}
float target2 = stones[i] + D;
if (map.count(target2))
{
result.push_back(vector<float>{target2, stones[i]}); // weight
}
map[stones[i]] = i;
}
return result;
}
int main() {
float d = 5.0;
vector<float> weights_test1 = {1.3, 3.2, 6.3, 4, 6, 5};
vector<vector<float>> result_test1 = findStonePairs(weights_test1, d);
cout << "test1:" << endl;
for (auto x : result_test1)
{
for (auto y : x)
{
cout << y << " ";
}
cout << endl;
}
return 1;
}
```
这个修改后的代码应该可以输出正确的结果。你可以再试一下,看看是否符合你的预期。
#include <iostream> #include <vector> #include <unordered_map> #include <queue> #include <algorithm> using namespace std; struct WordFreq { string word; int freq; bool operator<(const WordFreq& other) const { return freq == other.freq ? word > other.word : freq < other.freq; } }; vector<string> topKFrequent(vector<string>& words, int k) { unordered_map<string, int> freq; for (const auto& word : words) { freq[word]++; } priority_queue<WordFreq, vector<WordFreq>> pq; for (const auto& [word, f] : freq) { pq.push({word, f}); if (pq.size() > k) { pq.pop(); } } vector<string> result(k); for (int i = k - 1; i >= 0; i--) { result[i] = pq.top().word; pq.pop(); } return result; } int main() { int k; cin >> k; vector<string> words; string word; while (cin >> word) { if (word == "end") { break; } words.push_back(word); } auto result = topKFrequent(words, k); for (const auto& word : result) { cout << word << " "; } cout << endl; return 0; }
这段代码实现了前 k 个出现次数最多的单词的查找,使用了堆排序的思想,时间复杂度为 O(Nlogk),其中 N 为单词个数。
具体实现过程如下:
1. 首先使用哈希表统计每个单词出现的频率。
2. 然后使用优先队列(堆)存储单词和对应的频率,队列中最多只保存 k 个元素。
3. 遍历哈希表中的每个元素,将其插入优先队列中,如果队列中元素数量超过 k,则将队列中频率最小的元素弹出。
4. 最后,将优先队列中的 k 个单词按频率从大到小排序,并返回结果。
以下是代码解释:
```
#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <algorithm>
using namespace std;
// 定义一个结构体,用于存储单词和对应的频率
struct WordFreq {
string word;
int freq;
bool operator<(const WordFreq& other) const {
// 如果频率相同,按字母顺序从小到大排序;否则按频率从大到小排序
return freq == other.freq ? word < other.word : freq > other.freq;
}
};
vector<string> topKFrequent(vector<string>& words, int k) {
// 哈希表用于统计每个单词出现的频率
unordered_map<string, int> freq;
for (const auto& word : words) {
freq[word]++;
}
// 优先队列用于存储单词和对应的频率,队列中最多只保存 k 个元素
priority_queue<WordFreq, vector<WordFreq>> pq;
for (const auto& [word, f] : freq) {
pq.push({word, f});
if (pq.size() > k) {
pq.pop();
}
}
// 将优先队列中的 k 个单词按频率从大到小排序,并返回结果
vector<string> result(k);
for (int i = k - 1; i >= 0; i--) {
result[i] = pq.top().word;
pq.pop();
}
return result;
}
int main() {
int k;
cin >> k;
vector<string> words;
string word;
while (cin >> word) {
if (word == "end") {
break;
}
words.push_back(word);
}
auto result = topKFrequent(words, k);
for (const auto& word : result) {
cout << word << " ";
}
cout << endl;
return 0;
}
```
希望能够帮到你!
相关推荐
![text/plain](https://img-home.csdnimg.cn/images/20210720083646.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)