hdu 2141(排序+二分)

 1 /*

 2 *  排序+二分 

 3 */

 4 

 5 #include <stdio.h>

 6 #include <stdlib.h>

 7 #define N 501

 8 

 9 int a[N], b[N*N], c[N];

10 

11 int cmp(const void *a, const void *b) {

12     return *(int *)a - *(int *)b;

13 }

14 

15 int main() {

16     int l, n, m, s, i, j, k, tmp, tmpp, left, right, mid, flag, cas = 0;

17     while (scanf("%d%d%d", &l, &n, &m) != EOF) {

18         for (i=0; i<l; ++i) scanf ("%d", &a[i]);

19         for (k=-1,i=0; i<n; ++i) {

20             scanf ("%d", &tmp);

21             for (j=0; j<l; ++j) b[++k] = tmp + a[j];  

22         }

23         for (i=0; i<m; ++i) scanf ("%d", &c[i]);

24         qsort(b, k+1, sizeof(int), cmp);

25         scanf ("%d", &s);

26         printf ("Case %d:\n", ++cas);

27         while (s--) {

28             scanf ("%d", &tmpp);

29 //            if (tmpp-c[0]<b[0] || tmpp-c[m-1]>b[k]) {puts("NO"); continue;} 

30             flag = 0;

31             for (i=0; i<m; ++i) {

32                 tmp = tmpp - c[i];

33                 left = 0;

34                 right = k;

35                 while (left <= right) {

36                     mid = (left + right) >> 1;

37                     if (tmp == b[mid]) { flag = 1; break;}

38                     else if (tmp < b[mid]) right = mid - 1;

39                     else left = mid + 1;

40                 }

41                 if (flag) break;

42             }

43             if (flag) puts("YES");

44             else puts("NO");

45         }

46     }

47     return 0;

48 }

 

你可能感兴趣的:(HDU)