crash(dfs)

Description

某个6.1儿童节,nc和zxl参加了一场踩气球的游戏,规则如下: 
一共有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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值