zoukankan      html  css  js  c++  java
  • 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++ << ":
    ";
      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
    ";
       else
        cout << "YES
    ";
      }
     }
     return 0;
    }

    个人评价:

    在写二分法的时候常常会用到函数递归的调用方式,但是个人还是不习惯使用递归,比较想通过循环的方式写出来。后面还是会努力试试其他的方法,并且找到最合适的一种留下来使用。

    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    远景GIS云产品规划
    远景GIS云上线
    远景WEBGIS平台实现客户端SHP文件加载
    GIS平台结构设计
    一款基于HTML5的高性能WEBGIS介绍
    Git分布式工作流程
    Git服务器搭建
    Linux入门-9 软件管理基础(CentOS)
    Linux入门-8 Linux系统启动详解
    Linux入门-7 Linux管道、重定向以及文本处理
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/3903133.html
Copyright © 2011-2022 走看看