A21387. 小红收集了 n颗神奇的能量宝石,每颗宝石可能是正能量宝石(红色)或负能量宝石(蓝色)。当一颗红色宝石和一颗蓝色宝石的能量值绝对值相等时,它们可以配对产生强大的能量波。小红想知道她有多少种不同的宝石配对方案可以产生能量波?注意:能量值为0的宝石不能与其他能量值为非0的宝石配对,但可以与其他能量值为0的宝石配对。
填空题
较难
知识点
题目描述
题目描述
小红收集了 n颗神奇的能量宝石,每颗宝石可能是正能量宝石(红色)或负能量宝石(蓝色)。当一颗红色宝石和一颗蓝色宝石的能量值绝对值相等时,它们可以配对产生强大的能量波。
小红想知道她有多少种不同的宝石配对方案可以产生能量波?
注意:能量值为0的宝石不能与其他能量值为非0的宝石配对,但可以与其他能量值为0的宝石配对。
输入格式
第一行包含一个整数 n,表示能量宝石数量。第二行包含 n 个整数,分别表示每个能量宝石的能量值,为了方便表示,正能量宝石的能量值用正数表示,负能量宝石的能量值用负数表示。(0能量宝石是0)
输出格式
输出包含一个整数,表示小红的可选择方案数量。
样例输入 1
7
1 1 -1 -1 2 0 0样例输出 1
5
2样例输入2
10
1 2 1 -2 -1 2 -2 1 -1 2样例输出2
12样例1解释
以下用输入的顺序编号表示选择的宝石,方案为:(1, 3), (1, 4), (2, 3), (2, 4), (6, 7)。
参考答案
#include <bits/stdc++.h>
using namespace std;
/* 全局常量和变量 */
const int N=3e2+10; // 假设能量值的绝对值不会超过 100
long long n, cnt[N]; // cnt[i] 用来记录能量值映射后的出现次数
void solve() {
cin>>n;
// 读取 n 个能量值并分类计数
for (int i=1; i<=n; ++i) {
int x;
cin>>x;
if (x>=0)
cnt[x]++; // 非负值直接用下标 x 计数
else
cnt[100+abs(x)]++; // 负值映射到 100+|x|
}
// 先统计零值宝石两两配对的方案数
// cnt[0] 为能量值 0 的宝石数
long long ans=cnt[0] * (cnt[0] -1) /2;
// 再统计所有正负值绝对值相等的配对数
// 正值 v 在 cnt[v],负值 -v 在 cnt[v+100]
for (int v=1; v<=100; ++v) {
ans+=cnt[v] * cnt[v+100];
}
cout<<ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}
上一题
下一题