http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1101
快速排序、二分查找、三重循环。一直超时,原来是没有注意到时多重循环。
跳出循环三种方法
loop、多个标记+break,还有一种比较巧
#define MAX_SIZE 4
UINT i,j,nBits[MAX_SIZE];
BOOL bValid;
bValid = FALSE;
for(i = 0; i < MAX_SIZE; i++)
{
for(j = (i + 1); j < MAX_SIZE; j++)
{
if(nBit[i] == nBit[j])
{
bVlid = TRUE;
i = MAX_SIZE;
break;
}
}
}
zoj1101:
#include<stdio.h>
int a[1001],n;
int MAXCOST = 1610612734;
void sort(int left,int right)
{
int i=left;
int j=right;
int temp=a[left];
while(i<j)
{
while(i<j&&a[j]>=temp)
j--;
if(i<j)
{
a[i]=a[j];
i++;
}
else
break;
while(i<j&&a[i]<temp)
i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=temp;
if(i-1>left)
sort(left,i-1);
if(i+1<right)
sort(i+1,right);
}
int binsrch(int low,int high,int x)
{
int mid=(low+high)/2;
if(x==a[mid])
return 1;
if(low>high)
return 0;
if(x>a[mid])
return binsrch(mid+1,high,x);
else
return binsrch(low,mid-1,x);
}
int main()
{
int i,j,k,t,x,tmp;
while(scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
t=-1;
sort(0,n-1);
for(i=n-1;i>=0;i--)
for(j=n-1;j>=0;j--)
if(i!=j)
for(k=n-1;k>=0;k--)
if(k!=j&&k!=i)
{ x=a[i]-a[j]-a[k];
if(x!=a[i]&&x!=a[j]&&x!=a[k]&&binsrch(0,n-1,x))
{
t=1;
tmp=a[i];
goto loop;
}
}
loop: if(t==-1)
printf("no solution/n");
else
printf("%d/n",tmp);
}
return 0;
}