首页 > 代码库 > zoj1101解题报告

zoj1101解题报告

   题目大致意思是找出赌徒出的最大筹码,这个筹码必须为另外3个赌徒所出筹码之和.感觉和折半搜索的思想类似,因为要求最大的筹码,先从n-1开始。

    sum1 = bet[t] - bet[i];

    其中t从n-1开始,i从0开始.

    sum2 = bet[j] + bet[k];

    其中j从i+1开始搜,然后用2分查找k(j+1,n-1),sum1 == sum2,则输出.

    由于刚开始没考虑到筹码为负数所带来的影响,导致顺序为t>k>j>i.当出现wrong answer时,才开始思考发现如-6 1 3 4时k,j的序号要比t大,其中要注意的是因为是枚举要判断一下是否t!=k && t!=j.虽然修改后对了,但我发现了一种特殊情况测试数据没有考虑到如-1 -2 -3 -6.就是说t<i<j<k.的情况,需要当成一种情况,注意t!=i.

  代码如下:

    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <limits.h>
    #include <string.h>
    #include <algorithm>
    #include <functional>
    using namespace std;
    int bet[1005];
    int find(int i,int j,int k,int sum){
            int a;
            while(i <= j){
            a = (i + j)>>1;
            if(k + bet[a] == sum) return a;
            if(k + bet[a] > sum) j = a - 1;
            else i = a + 1;
   }
  return 0;
}//二分搜索
    int main(){
    int n;
    while(scanf("%d",&n) && n){
        for(int i = 0;i < n;i++)
           scanf("%d",&bet[i]);
      sort(bet,bet+n);
      int sum,k,judge = 1;
      for(int i = n - 1;i >= 0;i--){
           for(int j = 0;j <= n - 3;j++){

               if(j == i) continue;
               sum = bet[i] - bet[j];
      for(k = j + 1;k <= n - 2;k++){
             if(k == i) continue;
             int m = find(k + 1,n - 1,bet[k],sum);
             if(m!=i && m){
             judge = 0;
             printf("%d\n",bet[i]);
             break;
           }
        }
      if(!judge) break;
    }
     if(!judge) break;
  }
   if(judge){
     printf("no solution\n");
   }
  }
        return 0;
   }

 

zoj1101解题报告