码迷,mamicode.com
首页 > 其他好文 > 详细

hihocoder [Offer收割]编程练习赛14 小Hi和小Ho的礼物

时间:2017-04-16 23:09:39      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:编程   hihocoder   body   输入   pre   i++   pac   统计   ble   

题目1 : 小Hi和小Ho的礼物

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

某人有N袋金币,其中第i袋内金币的数量是Ai。现在他决定选出2袋金币送给小Hi,再选2袋金币送给小Ho,同时使得小Hi和小Ho得到的金币总数相等。他想知道一共有多少种不同的选择方法。

具体来说,有多少种下标四元组(i, j, p, q)满足i, j, p, q两两不同,并且i < j, p < q, Ai + Aj = Ap + Aq。  

例如对于数组A=[1, 1, 2, 2, 2],一共有12种选法:

i j p q
1 3 2 4
1 3 2 5
1 4 2 3
1 4 2 5
1 5 2 3
1 5 2 4
2 3 1 4
2 3 1 5
2 4 1 3
2 4 1 5
2 5 1 3
2 5 1 4

输入

第一行包含一个整数N。  

第二行包含N个整数,A1, A2, A3 ... AN。

对于70%的数据,1 <= N <= 100  

对于100%的数据,1 <= N <= 1000, 1 <= Ai <= 1000000

输出

不同选择的数目。

样例输入
5  
1 1 2 2 2
样例输出
12
//按两数和统计一下 注意去掉i == p or j == q的情况
#include<map>
#include<cstdio>
#include<iostream>
using namespace std;
int n,a[(int)1e3+5],cnt[(int)1e6+5];
map<int,int>sum;long long ans;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",a+i),cnt[a[i]]++;
    for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) sum[a[i]+a[j]]++;
    for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++){
        ans+=sum[a[i]+a[j]];
        if(a[i]!=a[j])
            ans-=cnt[a[i]]+cnt[a[j]]-1;
        else
            ans-=2*(cnt[a[i]]-1)-1;
    }
    cout<<ans;
    return 0;
}

 

 

hihocoder [Offer收割]编程练习赛14 小Hi和小Ho的礼物

标签:编程   hihocoder   body   输入   pre   i++   pac   统计   ble   

原文地址:http://www.cnblogs.com/shenben/p/6720005.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!