zoukankan      html  css  js  c++  java
  • UVA-1152 4 Values whose Sum is 0 (二分)

    题目大意:在4个都有n个元素的集合中,每个集合选出一个元素,使得4个数和为0。问有几种方案。

    题目分析:二分。任选两组求和,剩下两组求和,枚举第一组中每一个和sum,在第二组和中查找-sum的个数,累加起来便得答案。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<vector>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    int a[4000][4];
    vector<int>v1,v2;
    
    int f1(int l,int r,int x)///查找下界
    {
        int lp,m;
        while(l<r){
            m=l+(r-l)/2;
            if(v2[m]<x){
                lp=l=m+1;
            }else
                lp=r=m;
        }
        return lp;
    }
    
    int f2(int l,int r,int x)///查找上界
    {
        int up,m;
        while(l<r){
            m=l+(r-l)/2;
            if(v2[m]<=x)
                up=l=m+1;
            else
                up=r=m;
        }
        return up;
    }
    
    int main()
    {
        int T,n;
        scanf("%d
    ",&T);
        while(T--)
        {
            scanf("%d",&n);
            v1.clear(),v2.clear();
            for(int i=0;i<n;++i)
                for(int j=0;j<4;++j)
                    scanf("%d",&a[i][j]);
            for(int i=0;i<n;++i){
                for(int j=0;j<n;++j){
                    v1.push_back(a[i][0]+a[j][1]);
                    v2.push_back(a[i][2]+a[j][3]);
                }
            }
    
            int ans=0;
            sort(v2.begin(),v2.end());
            for(int i=0;i<n*n;++i){
                int lpos=f1(0,n*n,-v1[i]);
                int upos=f2(0,n*n,-v1[i]);
                ans=ans+upos-lpos;
            }
            printf("%d
    ",ans);
            if(T)
                printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    NET中的类型和装箱/拆箱原理
    转 C# 装箱和拆箱[整理]
    理解线程同步
    IsBackground的理解
    赛马会面试题
    FTP上传类
    FTPS加密上传
    转载WPF SDK研究 之 AppModel
    SQL Server查看错误日志存档编号及其详情
    Hive基础编程入门(一)
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4866416.html
Copyright © 2011-2022 走看看