Can you find it?(二分)
来源:互联网 发布:阿里云logo矢量图 编辑:程序博客网 时间:2024/06/02 03:15
#include<cstdio>#include<algorithm>#define N 505using namespace std;__int64 a[N],b[N],c[N],sum[N*N];__int64 la,lb,lc,len;int bin(__int64 x){__int64 l=0,r=len-1,mid;while(l<=r){mid=(l+r)/2;if(sum[mid]==x) return 1;else if(sum[mid]>x) r=mid-1;else l=mid+1;}return 0;}int main(){__int64 i,j,cas=0,s,x,k,m;while(~scanf("%I64d%I64d%I64d",&la,&lb,&lc)){__int64 len=0;for(i=0;i<la;i++) scanf("%I64d",&a[i]);for(i=0;i<lb;i++) scanf("%I64d",&b[i]);for(i=0;i<lc;i++) scanf("%I64d",&c[i]);for(i=0;i<la;i++) for(j=0;j<lb;j++) sum[len++]=a[i]+b[j]; scanf("%I64d",&m); printf("Case %I64d:\n",++cas);sort(sum,sum+len);sort(c,c+lc);while(m--){__int64 pp;scanf("%I64d",&s);if(s<c[0]+sum[0]||s>c[la-1]+sum[len-1]){printf("NO\n");continue;}for(i=0;i<lc;i++){pp=s-c[i];if(bin(pp)){printf("YES\n");break;} }if(i==lc) printf("NO\n");} }return 0;}
Problem Description
Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.
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".
Sample Input
3 3 31 2 31 2 31 2 331410
Sample Output
Case 1:NOYESNOab数组合并,改为:A+B=X-C,然后二分搜一下就可以了
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int N = 505;
- __int64 ab[N * N];
- int num;
- int search(__int64 x)
- {
- int f = 0, l = num - 1;
- int mid;
- while(f <= l)
- {
- mid = (f + l) / 2;
- if(ab[mid] == x)
- return 1;
- else if(ab[mid] < x)
- f = mid + 1;
- else
- l = mid - 1;
- }
- return 0;
- }
- int main()
- {
- int n, m, l, flag = 0, s;
- __int64 a[N], b[N], c[N], x;
- while(cin >> n >> m >> l)
- {
- flag++;
- num = 0;
- for(int i = 0; i < n; i++)
- scanf("%I64d", &a[i]);
- for(int i = 0; i < m; i++)
- scanf("%I64d", &b[i]);
- for(int i = 0; i < l; i++)
- scanf("%I64d", &c[i]);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < m; j++)
- ab[num++] = a[i] + b[j];
- sort(ab, ab+num);
- sort(c, c+l);
- scanf("%d", &s);
- printf("Case %d:\n", flag);
- while(s--)
- {
- scanf("%I64d", &x);
- if(x < ab[0] + c[0] || x > ab[num-1] + c[l-1])
- printf("NO\n");
- else
- {
- __int64 p;
- int j;
- for(j = 0; j < l; j++)
- {
- p = x - c[j];
- if(search(p))
- {
- printf("YES\n");
- break;
- }
- }
- if(j == l)
- printf("NO\n");
- }
- }
- }
- return 0;
- }
错误代码,找了好长时间就是不知道哪错了,醉了#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; __int64 a[505],b[505],c[505],la,lb,lc; __int64 sum[505*505],len; int bin(__int64 x) { __int64 l = 0,r = len-1; while(l<=r) { __int64 mid = (l+r)>>1; if(sum[mid] == x) return 1; else if(sum[mid]>x) r = mid-1; else l = mid+1; } return 0; } int main() { __int64 m,s,cas = 1,i,j,k; while(~scanf("%I64d%I64d%I64d",&la,&lb,&lc)) {__int64 len=0; //出错点 for(i = 0; i<la; i++) scanf("%I64d",&a[i]); for(i = 0; i<lb; i++) scanf("%I64d",&b[i]); for(i = 0; i<lc; i++) scanf("%I64d",&c[i]); sort(c,c+lc); for(i = 0; i<la; i++) { for(j = 0; j<lb; j++) { sum[len++] = a[i]+b[j]; } } sort(sum,sum+len); len = unique(sum,sum+len)-sum; scanf("%I64d",&m); printf("Case %I64d:\n",cas++); while(m--) { scanf("%I64d",&s); if(s>sum[len-1]+c[lc-1] || s<sum[0]+c[0]) { printf("NO\n"); continue; } __int64 flag = 0; for(i = 0;i<lc;i++) { int kk = s-c[i]; if(bin(kk)) { flag = 1; break; } } if(flag) printf("YES\n"); else printf("NO\n"); } } return 0; }
0 0
- hdu2141 Can you find it? (二分)
- Can you find it?(二分)
- Can you find it?(二分)
- Can you find it? (二分)
- can you find it (二分)
- Can you find it?---二分
- Can you find it?(二分)
- Can you find it? 【二分】
- Can you find it? 二分
- [ACM] hdu 2141 Can you find it? (二分查找)
- HDOJ 题目2141 Can you find it?(二分搜索)
- HDOJ 2141 Can you find it?(二分)
- HDU 2141 Can you find it?(二分查找)
- HDU - 2141 Can you find it?(二分查找)
- hdu 2141 Can you find it?(二分查找)
- hdu 2141 Can you find it?(暴力+二分)
- 题解: HDU 2141 Can you find it? (二分查找)
- hdu2141 Can you find it? (二分查找)
- OC数据持久化
- jQuery.nivo.slider.js 幻灯片图片切换
- 设计模式之观察者模式
- 安卓学习笔记---RecyclerView的五大开源项目-解决办法
- RecyclerView添加Header的正确方式
- Can you find it?(二分)
- 【Light】[1137]Expanding Rods
- IO流4(补充
- tools:replace="android:icon" 的作用和替代方法
- 初入VS和CSDN
- css文件
- hdoj 5734 5742 5744 2016多校2(复现)<数学---思维----贪心>
- 从wap页面跳转app(Android)
- Android NDK Samples