HDU 2141 Can you find it? (二分)
Posted 若有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2141 Can you find it? (二分)相关的知识,希望对你有一定的参考价值。
题目链接:
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
题目大意:
多组数据输入
第一行是三个序列各自元素的个数
第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? (二分)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 2141 Can you find it? 二分查找
HDU 2141 Can you find it? (二分)