HDU 2141 Can you find it? (二分)
阿新 • • 發佈:2018-04-21
input int you time chm source tis 去掉 註意
Input
There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent the sequences B, in the forth line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.
Output
For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".
Author
wangye
題目鏈接:
Can you find it?
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)
Total Submission(s): 38634 Accepted Submission(s): 9395
Sample Input 3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Sample Output Case 1: NO YES NO
Source HDU 2007-11 Programming Contest
題目大意:
多組數據輸入
第一行是三個序列各自元素的個數
第2,3,4是三個序列
第4行是x的個數
下面的x行是多種情況的x值
分析:
三個序列三個數組,把前面兩個數組組合為一個數組
比如1 2 3,1 2 3,這兩個序列組合為一個數組‘
1+1,1+2,1+3,2+1,2+2,2+3,3+1,3+2,3+3,
計算一下就是
2,3,4,3,4,5,4,5,6,有重復的但是不用去掉,稱這個序列為t
然後與第三個序列組合
1 ,2,3,(第三個序列)
然後將t序列升序排序,t與第三個序列組合的時候,t序列采用二分尋找數據
註意點:
1.不能采用set去重,不然會超內存(第一次遇到超內存,好激動啊啊啊啊啊)
2.對t序列不能采用for循環尋找數據,要采用排好序之後再二分查找數據,不然會超時
代碼如下:
#include<bits/stdc++.h> using namespace std; bool cmp(int a,int b) { return a<b; } int main() { int n1,n2,n3,n=1; while(~scanf("%d %d %d",&n1,&n2,&n3)) { int a[n1],b[n2],c[n3]; for(int i=0; i<n1; i++) { scanf("%d",&a[i]); } for(int j=0; j<n2; j++) { scanf("%d",&b[j]); } for(int k=0; k<n3; k++) { scanf("%d",&c[k]); } int xn; int t[n1*n2]; scanf("%d",&xn); int x[xn]; for(int i=0; i<xn; i++) { scanf("%d",&x[i]); } int y=0; for(int i=0; i<n1; i++) { for(int j=0; j<n2; j++) { int z=a[i]+b[j]; t[y]=z; y++; } } sort(t,t+(n1*n2),cmp); printf("Case %d:\n",n); for(int i=0; i<xn; i++) { int f=0; for(int k=0;k<n3;k++) { int l=0,h=n1*n2-1; while(l<=h) { int mid=(l+h)/2; if(t[mid]==x[i]-c[k]) { f=1; break; }else if(t[mid]>x[i]-c[k]) { h=mid-1; }else if(t[mid]<x[i]-c[k]) { l=mid+1; } } if(f==1) break; } if(f==1) { printf("YES\n"); } else { printf("NO\n"); } } n++; } return 0; }
哈哈哈哈哈哈哈哈哈哈
今天真的是超級開心
不準吐槽。。。。。
。。。。。。。。。。
HDU 2141 Can you find it? (二分)