Description
某个6.1儿童节,nc和zxl参加了一场踩气球的游戏,规则如下:
一共有99个气球,标号为2~99,nc和zxl去踩气球,每踩爆一个好的气球,踩的人就拿自己目前的分值乘以气球的标号(初始分值为 1),一定时间后,所有气球都会消失,然后nc和zxl都会上报自己最后的分数,这时候有你来判断胜负。为什么要判断呢,因为他俩的数学不太好,会出现算 错的情况,然后你就要根据以下规则判断了:
如果能判断低分的自己本身算错了,就判高分的赢(无论高分的是否算错); 如果高分算错了且低分的没算错,就是低分的赢。如果两人都没有算错,但是两人的目标分数都必须要踩同一个气球才能得到,就算低分的赢;如果都没有算错而且 目标分数不冲突就是高分的赢。(所谓算错就是说无法由2-100的若干数相乘得到)
一共有99个气球,标号为2~99,nc和zxl去踩气球,每踩爆一个好的气球,踩的人就拿自己目前的分值乘以气球的标号(初始分值为 1),一定时间后,所有气球都会消失,然后nc和zxl都会上报自己最后的分数,这时候有你来判断胜负。为什么要判断呢,因为他俩的数学不太好,会出现算 错的情况,然后你就要根据以下规则判断了:
如果能判断低分的自己本身算错了,就判高分的赢(无论高分的是否算错); 如果高分算错了且低分的没算错,就是低分的赢。如果两人都没有算错,但是两人的目标分数都必须要踩同一个气球才能得到,就算低分的赢;如果都没有算错而且 目标分数不冲突就是高分的赢。(所谓算错就是说无法由2-100的若干数相乘得到)
Input
多组数据,每组数据一行,两个数。
Output
每组输入数据输出赢的人的分数。
Sample Input
3
349 49
3599 610
62 36
Sample Output
49
610
62
思路:一开始想dfs乘起来看能否组成低分或者高分。但是复杂度太高了,看了题解都是dfs分解的。正着不行就反着呗。
后面对于输出条件判断也很巧。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n,m,flag1=0,flag2=0;
void dfs(int a,int b,int x)
{
if(flag2==1)//低分 高分都分解成功立刻结束。
return;
if(a==1 && b==1)//如果低分和高分,在不冲突情况下分解成功立刻将flag2=1。
{
flag1=1;
flag2=1;//如果flag2=1则说明低分一定能分解,且高分在不与低分冲突情况下分解成功。
return;
}
if(b==1)//一旦低分分解成功就立即将flag1=1。
flag1=1;
if(x<2)//本次分解失败。
return;
if(b%x==0)//一定要先分解低分。
dfs(a,b/x,x-1);
if(a%x==0)//分解高分。
dfs(a/x,b,x-1);
dfs(a,b,x-1);//对于当前x不能分解。
}
int main()
{
int t,i;
int a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
a=max(n,m);
b=min(n,m);
flag1=0;
flag2=0;
dfs(a,b,100);
if(flag2 || !flag1)//都能分解且不冲突,低分分解失败高分胜利。
printf("%d\n",a);
else
printf("%d\n",b);
}
return 0;
}