我尝试了以下代码,但找不到错误。错误在循环部分中,但我无法弄清楚如何正确使用迭代器以避免错误。 请帮助,请阐明我的概念。问题陈述是https://codeforces.com/contest/268/problem/A。我已经通过矢量解决了]
int main()
{
std::ios::sync_with_stdio(false);
int n,x,y,count=0; cin>>n;
std::vector<pair<int,int>> v;
for (int i = 0; i < n; ++i)
{
cin>>x>>y;
v.push_back(make_pair(x,y));
}
for (int i = 0; i < n; ++i)
{
for (int j=i+1; j < n; ++j)
{
if(v[i].f==v[j].s){
count++;
}
if(v[i].s==v[j].f){
count++;
}
}
}
cout<<count;
return 0;
}
但是通过地图有问题。使用地图时出现SIGTSTP错误。
#include <iostream>
#include <map>
using std::cin;
using std::cout;
using std::make_pair;
int main() {
std::ios::sync_with_stdio(false);
int n, x, y, count = 0;
cin >> n;
std::map<int, int> m;
for (int i = 0; i < n; ++i) {
cin >> x >> y;
m.insert(make_pair(x, y));
}
for (auto i = m.begin(); i != m.end(); ++i) {
for (auto j = ++i; j != m.end(); ++j) {
if (i->first == j->second) {
count++;
}
if (i->second == j->first) {
count++;
}
}
}
cout << count;
return 0;
}
您不能使用地图数据结构解决此问题,因为地图以映射方式存储元素。每个元素都有一个键值和一个映射值。 没有两个映射值可以具有相同的键值。但是根据问题,键值可以相同,所以这就是为什么您不能在这里使用map的原因。有关更多详细信息,请参见http://www.cplusplus.com/reference/map/map/
这是我的答案:
#include <iostream>
#include <map>
const int N = 50;
int h[N], a[N];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", h + i, a + i);
}
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (i != j) {
if (h[i] == a[j]) ans++;
}
printf("%d\n", ans);
return 0;
}
问题的答案是sigma { h[i] = a[j] } (i != j)
。
您的代码犯了这些错误:
std::map::insert
表示将特定键设置为特定值。另外,std::map
与std::multimap
不同。后者允许存在多个相同的键,而前者则不允许。
您不应该将j
的起点设为i + 1
,因为迭代范围应该是[0, i - 1]
并集[i + 1, n - 1]
(编辑:您的代码逻辑也是正确的。)]]
迭代器不能如此轻率地自我增加,因为它具有注释部分所指出的副作用。