• hdu 1895(二分)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1895

    思路:

    就是先两两合并,然后排序一下二分就可以了,最后要注意的地方就是二分找到解得时候,还要看一下相邻的数是否与解相等(因为可能有多个这样的数)

    Ps:郁闷死了,一开始用的是long long ,然后wa到死,结果改成int就过了,而且那个1000000007也没有用,orz...

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 #define MAXN 333
     8 int num[6][MAXN];
     9 int Ha[MAXN*MAXN],Hb[MAXN*MAXN],Hc[MAXN];
    10 int n1,n2,n3,n4,n5,h1,h2,h3;
    11 int ans;
    12 
    13 int Binary_Search(int l,int h,int x){
    14     while(l<=h){
    15         int mid=(l+h)/2;
    16         if(Hb[mid]==x){
    17             int sum=1;
    18             for(int i=mid-1;i>=1&&Hb[i]==x;i--)sum++;
    19             for(int i=mid+1;i<=h2&&Hb[i]==x;i++)sum++;
    20             return sum;
    21         }else if(Hb[mid]<x){
    22             l=mid+1;
    23         }else 
    24             h=mid-1;
    25     }
    26     return 0;
    27 }
    28 
    29 
    30 void Solve(){
    31     ans=h1=h2=h3=0;
    32     for(int i=1;i<=n5;i++)Hc[++h3]=num[5][i];
    33     for(int i=1;i<=n1;i++)
    34         for(int j=1;j<=n2;j++)
    35             Ha[++h1]=num[1][i]+num[2][j];
    36     for(int i=1;i<=n3;i++)
    37         for(int j=1;j<=n4;j++)
    38             Hb[++h2]=num[3][i]+num[4][j];
    39     sort(Ha+1,Ha+h1+1);
    40     sort(Hb+1,Hb+h2+1);
    41     sort(Hc+1,Hc+h3+1);
    42     for(int i=1;i<=h3;i++){
    43         for(int j=1;j<=h1;j++){
    44             int x=-(Hc[i]+Ha[j]);
    45             ans+=Binary_Search(1,h2,x);
    46         }
    47     }
    48     printf("%d\n",ans);
    49 }
    50 
    51 
    52 int main(){
    53     int _case;
    54     scanf("%d",&_case);
    55     while(_case--){
    56         scanf("%d",&n1);
    57         for(int i=1;i<=n1;i++)scanf("%d",&num[1][i]);
    58         scanf("%d",&n2);
    59         for(int i=1;i<=n2;i++)scanf("%d",&num[2][i]);
    60         scanf("%d",&n3);
    61         for(int i=1;i<=n3;i++)scanf("%d",&num[3][i]);
    62         scanf("%d",&n4);
    63         for(int i=1;i<=n4;i++)scanf("%d",&num[4][i]);
    64         scanf("%d",&n5);
    65         for(int i=1;i<=n5;i++)scanf("%d",&num[5][i]);
    66         Solve();
    67     }
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    Easy-Transfer学习
    录音+语音转文字
    pyQt点击事件和数据传输
    第一个python-ui界面
    python写第一个网页
    pyhthon第一个小脚本——文件备份
    Stones HDU 1896
    Cow Sorting POJ 3270 & HDU 2838
    Stones
    大数相加
  • 原文地址:https://www.cnblogs.com/wally/p/3084971.html
Copyright © 2020-2023  润新知