【杭电2141】Can you find it?
2016-07-26 20:42
239 查看
我首先想到的是三重循环—-超时,后来想前两个数组双重循环套第三个数组二分查找—-还是超时,再后来就是现在的代码思路了300多ms。
其实和第二种想法很接近了,就是二分的对象变了,对第三个数组遍历循环,对前两个数组各项求和得到的数组求二分,因为这样就大大大大减少了循环次数,二分是省时间的嘛。
本题难点算法优化。
#include<cmath> #include<algorithm> #include<stdio.h> using namespace std; int a[505],b[505],c[505]; int dp[250025]; int main() { int i,j,k,m,n,s,t,cas=0,p,flag; while(scanf("%d%d%d",&k,&m,&n)!=EOF) { for(i=0; i<k; i++) scanf("%d",&a[i]); for(i=0; i<m; i++) scanf("%d",&b[i]); for(i=0; i<n; i++) scanf("%d",&c[i]); p=0; for(i=0; i<k; i++) for(j=0; j<m; j++) dp[p++]=a[i]+b[j]; sort(dp,dp+p); printf("Case %d:\n",++cas); scanf("%d",&t); while(t--) { scanf("%d",&s); flag=0; for(i=0; i<n; i++) { int l=0,r=p-1,mid; while(l<=r) { mid=(l+r)/2; if(dp[mid]+c[i]==s) { flag=1; break; } else if(dp[mid]+c[i]<s) l=mid+1; else if(dp[mid]+c[i]>s) r=mid-1; } if(flag) break; } if(flag) printf("YES\n"); else printf("NO\n"); } } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=2141
相关文章推荐
- MySQL 优化
- Google排名优化的几个影响因素
- DB2优化(简易版)
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- C#中尾递归的使用、优化及编译器优化
- 对优化Ruby on Rails性能的一些办法的探究
- 优化Ruby脚本效率实例分享
- Asp编码优化技巧
- 如何监测和优化OLAP数据库
- mysql -参数thread_cache_size优化方法 小结
- MySQL数据库优化技术之配置技巧总结
- Oracle数据库中SQL语句的优化技巧
- 深入学习SQL Server聚合函数算法优化技巧
- MySQL常见的底层优化操作教程及相关建议
- 详解mysql的limit经典用法及优化实例
- 数据库学习建议之提高数据库速度的十条建议
- oracle数据库sql的优化总结
- C++二分查找在搜索引擎多文档求交的应用分析
- SQL语句性能优化(续)
- SQL语句优化提高数据库性能