Hdu2141Canyoufindit排序+二分查找.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Hdu2141Canyoufindit排序二分查找

Hdu2141 Can you find it?解题报告 /* Name: hdu2141解题报告 Copyright: ecjtu_acm训练基地 Author: yimao Date: 03-08-10 19:17 Description: 数据关系处理+排序+二分查找 */ 一、题目 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 3 1 2 3 1 2 3 1 2 3 3 1 4 10 Sample Output Case 1: NO YES NO 二、题目大意及分析 给定三个数组a,b,c,每个数组有若干个数(=500个),再给定一个数s要你判断是否存在s=a[i]+b[j]+c[k],存在一组数就输出YES,一组都不存在就输出NO。 因为只有三个500大小的数组,刚开始我直接写了三个for循环,超时,再看看题目就更清楚了,每组测试数据中给的s是=1000个,这就很容易超时,而且,给的数可以是负数,这样即使是我用了sort全部排序,也无济于事。 无奈之下直接百度,才发现已经AC的人都先把a数组和b数组中的数相加成一个ab[500×500]的数组,这样就相当于ab[i]+c[j]=s;再变形一下,ab[i]=c[j]+s;这样我就知道接下来要干什么了,只要在ab数组里用以前学的二分查找看能否把c[j]+s找出来,貌似以前也有过这类要把数据关系进行转换的题。 直接写代码就顺风顺水了。 三、部分代码及相关分析 int find(int l,int r,int s) //二分查找,必记; { while(l=r) { int mid=(l+r)1; if(ab[mid]==s) return 1; if(ab[mid]s) r=mid-1; else l=mid+1; } return 0; } 再附上一部分写了很久的源代码: for(i=1;i=Q;i++) { scanf(%d,s); flag=0; for(j=1;j=lc;j++) //开始这里写i WA了好久; { temp=s-c[j]; //开始用s出错,应用一个temp; 这里也写过一个c[i]错的久,,//这阵子似乎写代码一直感觉不好。。。 if(find(1,lab,temp)) { flag=1; break; } } 3

文档评论(0)

pengyou2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档