您的位置:首页 > 理论基础 > 计算机网络

第十一届北京师范大学程序设计竞赛(网络同步赛)+沙漠之旅

2013-05-01 11:15 344 查看
沙漠之旅

/*
思路:
由于直接穷举4个循环肯定会超时,于是把四桶油分为两组
先把两桶油之和穷举出来放在b[]中,要求的问题就变为在b[]中找出两个元素,其和为l-x。用二分查找即可。
*/
#include<iostream>
using namespace std;
int cmp ( const void * a , const void * b ){
return *(int * ) a- * ( int * ) b;
}
int main()
{
int t;
cin>>t;
while(t--){
int l,x,n;
cin >> l >> x >> n;
int i , j;
int a[1002] , b[1002] , k = 0 ;
for ( i = 0 ; i < n; i ++){
cin >> a[i];
}
for( i =0 ; i < n ; i ++)
for( j =0 ; j< n ; j ++)
if( (a[i] + a[j] ) <= ( l -x ))
b[k++] = a[i] + a[j] ;
qsort( b , n , sizeof(b[0]) , cmp);
for( i =0 ; i < k ; i++)
{
int low = 0 ,heigh = k - 1 , mid , l1 = l - ( x + b[i] );
while( low <= heigh )
{
mid = ( low + heigh ) / 2 ;
if( b[mid] < l1 )
low = mid + 1 ;
else
heigh = mid + 1 ;
}
if( b[mid] = l1 ){
cout << "YES" << endl ;
break;
}
}
if( i >= k )
cout << "NO" << endl ;
}
return 0;
}

/*
思路:
由于直接穷举4个循环肯定会超时,于是把四桶油分为两组
先把两桶油之和穷举出来放在b中,要求的问题就变为在b中找出两个元素,其和为l-x。用二分查找即可。
*/

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin >> t;
while( t -- ){
int i , l , x , n , a[1005] ;
cin >> l >> x >> n ;
for( i = 0 ; i < n ; i ++)
cin >> a[i] ;
vector<int>b;
for( i = 0 ;i < n ; i ++ )
for( int j = 0 ; j < n ; j ++)
if( ( a[i] + a[j] ) < ( l -x))
b.push_back ( a[i] + a[j] ) ;
sort(b.begin() , b.end() );
for( i = 0 ; i < b.size() ; i ++)
{
if(binary_search(b.begin(), b.end(), l-x-b[i]) )
break;
}
if(i < b.size() )
cout << "YES" << endl ;
else
cout << "NO" << endl ;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐