二分贪心--04

来源:互联网 发布:java以空格分隔字符串 编辑:程序博客网 时间:2024/06/07 00:22

题目大概:

输入n行数据,每行数据有四个数,共四组数,从四组数中挑出一个,组成一列数,找出四组数中相加为零的数列的个数。

思路:

前两列数相加,有n*n个和,后两列数相加,有n*n个和,找出两组和相加为零的个数,可以把一组和排序,然后用upper_bound()和lower_bound()函数,求每一个和为零的个数。

代码:

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;int a[4000],b[4000],c[4000],d[4000],ab[16000000],cd[16000000];int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);}int k=0; for(int i=0; i<n; ++i)        for(int j=0;j<n;++j)            {cd[k++]=c[i]+d[j];            }    sort(cd,cd+n*n);    long long sum=0;    for(int i=0; i<n; ++i)        for(int j=0; j<n; ++j)        {            int ad=-(a[i]+b[j]);            sum+=upper_bound(cd,cd+n*n,ad)-lower_bound(cd,cd+n*n,ad);        }printf("%d",sum);    return 0;}


0 0
原创粉丝点击