首页 > 代码库 > 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解题报告