5388: C++实验:和值统计
总提交: 159 测试通过:33
描述
给定一个整数序列,并将序列中的元素两两相加,问有多少个不同的“和”值。
部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码。
int main() { int i, n, x; scanf("%d", &n); vector<int> vec; for(i=0;i<n;i++) { scanf("%d", &x); vec.push_back(x); } Solve(vec); return 0; }
输入
第一行为正整数n(n<=100),表示序列长度。
第二行为n个32位整数,表示序列中元素值。
输出
输出序列中两两元素之和值不同的个数。
同时按照“和值”从小到大的顺序输出“和”与等于该“和”的等式数目。
样例输入
3
1 2 2
样例输出
3
3 2
4 1
提示
和不同的情况有:
和为3的情况有2种,a1+a2=3, a1+a3=3
和为4的情况有1种,a2+a3=4
题目来源
标签
这道题卡了好久,试了好多都没过,最后知道是因为long long 太小了,要用unsigned.
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int Solve(vector<int> &vec){
map<unsigned long,unsigned long> qu;
long long x,i,j;
for(i=0;i<vec.size();i++){
for(j=i+1;j<vec.size();j++){
x=vec[i]+vec[j];
qu[x]++;
}
}
cout<<qu.size()<<endl;
map<unsigned long,unsigned long>::iterator it;
for(it=qu.begin();it!=qu.end();it++){
cout<<it->first<<' '<<it->second<<endl;
}
}
int main()
{
int i, n, x;
scanf("%d", &n);
vector<int> vec;
for(i=0;i<n;i++)
{
scanf("%d", &x);
vec.push_back(x);
}
Solve(vec);
return 0;
}