CCF - 201403-1 - 相反数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF - 201403-1 - 相反数相关的知识,希望对你有一定的参考价值。

问题描述

试题编号: 201403-1
试题名称: 相反数
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
输入格式
  第一行包含一个正整数 N。(1 ≤ N ≤ 500)。
  第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
输出格式
  只输出一个整数,即这 N 个数中包含多少对相反数。
样例输入
5
1 2 3 -1 -2
样例输出
2

 

思路

看似统计问题,问题在于如何统计。
1.使用STL的map进行统计是最为有效的办法;
2.输入值x满足-1000<=x<=1000,由于C/C++没有负数下标,就令y=x+1000,而把x映射为y,满足0<=y<=2000。再通过一个标志数组来进行判断和标记,输入数后则进行标记;
3.输入整数各不相同,问题变得稍微简单一些,可以只用标志数组解决。

代码

#include<iostream>
#include<map>
using namespace std;
int main()
{
    int i,n,b,sum;
    map<int,int>a;
    scanf("%d",&n);
    for(sum=0,i=1;i<=n;i++)
    {
        scanf("%d",&b);
        if(a.find(-b)==a.end())
            a[b]++;
        else
            sum++;
    }
    printf("%d\n",sum);
    return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
    int i,n,sum,a[2001],b;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(sum=0,i=0;i<n;i++)
    {
        scanf("%d",&b);
        if(a[1000-b]!=0)
            sum++;
        a[b+1000]++;
    }
    printf("%d\n",sum);
    return 0;
}
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int i,n,sum,a[1001],b;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(sum=0,i=0;i<n;i++)
    {
        scanf("%d",&b);
        if(a[abs(b)]!=0)
            sum++;
        a[abs(b)]++;
    }
    printf("%d\n",sum);
    return 0;
}

 

以上是关于CCF - 201403-1 - 相反数的主要内容,如果未能解决你的问题,请参考以下文章

CCF 201403-1 相反数

CCF_201403-1_相反数

CCF201403-1 相反数(100分)序列处理

CSP201403-1:相反数

CSP201403-1:相反数

算法题CCF CSP 1403-1