HDU 2141(二分&三分 _B题)解题报告

Posted caomingpei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2141(二分&三分 _B题)解题报告相关的知识,希望对你有一定的参考价值。

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

-----------------------------------------------------------------------------------

题意:三个数组,找到每个数组中加和为M的值的组数。

思路:首先将后两个数组加和 O(N^2),排序 O(NlogN),然后利用二分求解。

代码:

技术分享图片
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
int c1=0;


int main(void){
    int L,M,N;
    while(~scanf("%d %d %d",&L,&M,&N)){
    int A[L]={0};
    int B[M]={0};
    int C[N]={0};
    for(int i=0;i<L;i++){
        scanf("%d",&A[i]);
    }
    for(int i=0;i<M;i++){
        scanf("%d",&B[i]);
    }
    for(int i=0;i<N;i++){
        scanf("%d",&C[i]);
    }
    int  SM =0;
    scanf("%d",&SM);
    int S[SM]={0};
    for(int i=0;i<SM;i++){
        scanf("%d",&S[i]);
    }
    int bcm = M*N;
    int BC[bcm];
    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            BC[i*N+j]=B[i]+C[j];
        }
    }
    sort(BC,BC+bcm);
    int new_end = unique(BC,BC+bcm)-BC;
    c1++;
    printf("Case %d:\n",c1);
    for(int i=0;i<SM;i++){
    int flag =0;
    int tf =S[i];
    for(int j=0;j<L;j++){
        if(BC[(lower_bound(BC,BC+new_end,tf-A[j])-BC)]==tf-A[j]){
            flag =1;
            break;
        }
    }
    if(flag){
        printf("YES\n");
    }
    else{
        printf("NO\n");
    }    
    }
    
    
    }
    
    return 0;

}
View Code

 

以上是关于HDU 2141(二分&三分 _B题)解题报告的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 2141 Can you find it?(二分)

hdu-2141(二分查找+暴力)

LOJ #2141. 「SHOI2017」期末考试

HDU 2141 Can you find it?(二分)

HDU 2044(递推&递归_A题)解题报告

HDU 2141 can you find it 二分