7/21 A 解题报告
来源:互联网 发布:北京java晚班 编辑:程序博客网 时间:2024/06/15 20:20
7/21 A 解题报告
A题是说三个序列ABC,每个都有很多数,从每个序列中找出一个数相加等于给定的X。
这和紫书中的一个题类似,书上是4个集合找4个数相加为0。
基本方法就是把两个序列相加合并为一个和的集合,之后对这个集合排序并二分查找就有了。最终是nlogn的复杂度。如果二分的是另一个序列,则复杂度是n²logn,肯定不划算。
以下是代码(可直接AC):
#include <iostream>#include <algorithm>using namespace std;int tmp[250000];int comp(const void*a,const void*b){return *(int*)a-*(int*)b;}int main(){ int l,n,m,a[500],b[500],c[500],k,ca=0,p; int x,y,z; int low,high,mid; bool flag,quit,con; while(cin>>l>>n>>m) { x=y=z=0; for(int i=0;i<l;i++) cin>>a[i]; for(int i=0;i<m;i++) cin>>b[i]; for(int i=0;i<n;i++) cin>>c[i]; cin>>p; x=0; for(int j=0;j<l;j++) { for(int u=0;u<n;u++) { tmp[x++]=a[j]+b[u];//合并AB } } qsort(tmp,l*n,sizeof(int),comp); cout<<"Case "<<++ca<<":"<<endl; for(int i=0;i<p;i++) { quit=false; flag=false; con=true; low=-1;high=m; mid=(low+high)/2; cin>>k; for(int j=0;j<m&&!quit;j++)//对C集合每个元素 { low=-1;high=l*n;//为了边界可以取 mid=(low+high)/2; while(low<high-1)//二分 { if(tmp[mid]+c[j]==k) { quit=true; flag=true; cout<<"YES\n"; break; }else{ if(tmp[mid]+c[j]>k) { high=mid; mid=(low+high)/2; }else{ low=mid; mid=(low+high)/2; } } } } if(!flag) cout<<"NO\n"; } } return 0;}
0 0
- 7/21 A 解题报告
- A - SnowflakeSnowSnowflakes解题报告
- A - A+B(解题报告)
- 7/21 B 解题报告
- 7/21 C 解题报告
- 7/21 D 解题报告
- 7/21 E 解题报告
- 7/21 F 解题报告
- A+B Coming 解题报告
- USACO A Game解题报告
- 解题报告 codeforces 242A
- USACO A Game 解题报告
- codeforces 1A 解题报告
- A simple problem解题报告
- A - No Brainer解题报告
- E - A + B解题报告
- A - Lake Counting解题报告
- 解题报告:大牛也会不A题
- I - Faulty Odometer
- Hibernate中根据实体查询报错Ljava.lang.Object; cannot be。。。
- sdnu 1031 字母排序(拓扑排序的利用)
- 关于register修饰符以及在C 与 C++中的区别
- D - Game with Pearls
- 7/21 A 解题报告
- HDOJ_Problem Archive_1000_A + B Problem
- 安卓中的JSON解析
- Linux中出现/usr/bin/ld: cannot find -lxxx报错该怎么办?
- H - 24 Game
- linux awk命令详解
- 欢迎使用CSDN-markdown编辑器
- google ip 系列之一
- iOS接收null的处理方法