水题。
注意3个数加减最多能构造13个不同的数字。
当检测到能构造13个数时候直接break。
#include<cstdio>
#include<cstdlib>
//bool check(int *ans,int len,int x)
//{
// for(int i=0;i<len;i++)
// {
// if(ans[i]==x) return false;
// }
// return true;
//}
int slove(int a,int b,int c)
{
bool ans[201]={};
int k=0;
if(ans[a]==0) {ans[a]=1; k++;}
if(ans[b]==0) {ans[b]=1; k++;}
if(ans[c]==0) {ans[c]=1; k++;}
if(ans[a+b]==0) {ans[a+b]=1; k++;}
if(ans[abs(a-b)]==0&&(a-b)!=0) {ans[abs(a-b)]=1; k++;}
if(ans[a+c]==0) {ans[a+c]=1; k++;}
if(ans[abs(a-c)]==0&&(a-c)!=0) {ans[abs(a-c)]=1; k++;}
if(ans[b+c]==0) {ans[b+c]=1; k++;}
if(ans[abs(b-c)]==0&&(b-c)!=0) {ans[abs(b-c)]=1; k++;}
if(ans[a+b+c]==0) {ans[a+b+c]=1; k++;}
if(ans[abs(a+b-c)]==0&&(a+b-c)!=0) {ans[abs(a+b-c)]=1; k++;}
if(ans[abs(a+c-b)]==0&&(a+c-b)!=0) {ans[abs(a+c-b)]=1; k++;}
if(ans[abs(b+c-a)]==0&&(b+c-a)!=0) {ans[abs(b+c-a)]=1; k++;}
return k;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int x,y;
scanf("%d%d",&x,&y);
int maxi=0;
bool ok=0;
//int g=0;
for(int i=1;i<x;i++)
{
int temp=slove(i,x-i,y);
if(maxi<temp) maxi=temp; //printf("%d %d %d:%d\n",i,x-i,y,g); g++; }
if(maxi==13) {ok=1; break;}//printf("%d %d %d\n",i,x-i,y);
}
if(ok==1) {printf("%d\n",maxi); continue;}
for(int i=1;i<y;i++)
{
int temp=slove(i,y-i,x);
if(maxi<temp) { maxi=temp;}//printf("%d %d %d %d\n",i,y-i,x,g); g++;
if(maxi==13) { break;}//printf("%d %d %d",i,y-i,x);
}
printf("%d\n",maxi);
}
return 0;
}