【CCF题解】 2014-03-01-相反数(Easy)

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

#define maxn 500+10
int a[maxn];


int main(int argc, const char** argv) {
    int n;
    int count;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(a[i]+a[j]==0){
               count++;  
            }
        }
    }
    cout<<count<<endl;
    return 0;
}

// 其他解法1:
#include<bits/stdc++.h>
using namespace std;

const int N=500;
int a[N];

int main(int argc, const char** argv) {
    int n,cnt=0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    // 寻找相反数,使用两个指针向中间进行寻找
    int left=0;
    int right = n-1;
    while(left<right && a[left]<0 && a[right]>0) 
      if(a[left]+a[right]==0){
          cnt++;
          left++;
          right--;
      }else if(a[left]+a[right]<0){
         left++;  // 负数实在太大,向右边进行移动
      }else if(a[left]+a[right]>0){
          right--;
      }
      cout<<cnt<<endl;
    return 0;
}
// 其他解法2:
#include<bits/stdc++.h>
using namespace std;

int main(int argc, const char** argv) {
 
    map<int,int> m;
    int n,v,sum=0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>v;
        // 判断负数是否已经存在,构建map,进行统计
        if(m.find(-v)==m.end())
            m[v]++;
        else
            sum++;
    }

    cout<<sum<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值