1. 程式人生 > >HDU 2141(二分&三分 _B題)解題報告

HDU 2141(二分&三分 _B題)解題報告

opened span print -c name tac str 報告 nlog

題目鏈接: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題)解題報告