首页 > 代码库 > hdu2141
hdu2141
试题链接:点击这里
在我看来,对于这道题的解法,有很多常规的方法,但是都是使用二分。但是这段代码我第一眼看见是非常的短的,当时很怀疑,因为自己写的东西还是在细节方面处理的非常的糟糕。然后看见这段代码相对于网上的其他代码来讲是非常的短的。仔细看了看,思想是非常的精妙的,和以前自己处理的一个问题有异曲同工之美。
好了,先把他的代码贴出来,然后最后在自己写一些常规的代码吧。希望以后能够将模板完全的敲出来。
#include <iostream>#include <algorithm>using namespace std;int a[505],b[505],c[505];int sab[250005];bool find( int a, int l , int h ){ if( l > h ) return false; int mid = ( l + h ) / 2; if ( sab[mid] == a ) return true; else if( sab[mid] > a) find ( a, l, mid-1); else find ( a, mid+1, h);}//二分法本身就是利用递归的思想来实现的,//现在的这种情况自己看看是否是用for循环好还是通过函数的递归调用实现好int main(){ int l,n,m; int i,j,k; int s,sum,cnt = 1; while( cin >> l >> n >> m ) { for( i = 0; i < l; i++) cin >> a[i]; for( i = 0; i < n; i++) cin >> b[i]; for( i = 0; i < m; i++) cin >> c[i]; //在这里是先将所有的数据都输入到数组中保存 for(k = 0, i = 0;i < l; i++) for( j = 0; j < n; j++) sab[k++] = a[i] + b[j]; //这个的思路是将两个合并,保证在运行的过程中程序是不会 sort( sab, sab + k ); cin >> s; cout << "Case " << cnt++ << ":\n"; for( i = 0; i < s; i++ ) { cin >> sum; for( j = 0; j < m; j++) if ( find( sum - c[j] , 0 , k-1) ) //查找是否有满足的和 break; if( j == m) cout << "NO\n"; else cout << "YES\n"; } } return 0;}
个人评价:
在写二分法的时候常常会用到函数递归的调用方式,但是个人还是不习惯使用递归,比较想通过循环的方式写出来。后面还是会努力试试其他的方法,并且找到最合适的一种留下来使用。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。