ZJU 1003Crashing Ballon

2024-05-10 03:32
文章标签 zju 1003crashing ballon

本文主要是介绍ZJU 1003Crashing Ballon,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用回溯搜索,从2开始一直搜索因数到100。设获胜者的分数为m,挑战者的分数为n(m>n),当前搜索到的因数为p,flag1为是否两人分数能分解成一合法形式,flag2为挑战者的分数是否符合要求。搜索函数为f(m,   n,   p),初始时flag1   =   flag2   =   FALSE。由于每个因数只能出现一次,所以:如果p|m,则f(m   DIV   p,   n,   p+1),如果p|n,则f(m,   n   DIV   p,   p+1)。还有可能不分解出因数p,所以当p<m或p<n时,f(m,   n,   p+1)。当搜索到m=1且n=1时,说明存在一种没有出现相同因数的分解,设flag1为TRUE。如果发现n=1,则挑战者的分数可以分解,符合要求,设为TRUE。最后的分析表格同上表。优化:flag1和flag2的初始状态都是FALSE,我们由上面的分析可以发现,flag1只要变成TRUE,最后的答案也就定下来了,于是,当flag1发生改变时就可以退出搜索了。

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
using namespace std;
bool a1,b1;//低分获胜的回溯结果就是b == 1,a已经不可能为1.
int judge(int a,int b,int p)
{
if(a1)
return 0;
if(a == 1&&b == 1)
{
a1=true ;
return 0;
}
if(b == 1)
b1=true ;
while(p>1)
{
if(a%p==0)judge(a/p,b,p-1);
if(b%p==0)judge(a,b/p,p-1);
p--;
}
return 0;
}
int main()
{
int a,b;
while(cin>>a>>b)
{
a1=b1=false;
if(a<b)
swap(a,b);
judge(a,b,100);
if(b1&&!a1)
cout<<b<<endl;
else
cout<<a<<endl;
}
return 0;
}


这篇关于ZJU 1003Crashing Ballon的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975311

相关文章

zju 1008 Gnome Tetravex dfs

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008 check() 如果在k不是在最左边就水平两个三角形比较。不是在最上边就垂直两个三角形比较。 #include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<

[ZJU 2107]Quoit Design(平面最近点对)

【题目大意】: 给你N个点,求最近的两个点的距离,然后除以2输出。 【题目分析】: 这个就是经典的平面最近点对问题。求法就是分支策略,不断地二分,然后取最小。然后需要注意的就是越过中线的点对的处理。 其实那个很猥琐,想法就是找出变长为2ans*ans的矩形,然后进行枚举。这里有个很诡异的结论,就是这个矩形当中的点数不会超过8。 大致流程: 1、先按照x和y坐标进行排序2、调用分治程序3

现代金融业务_zju_2020

一、选择题 30+个 72原则 二、判断题 勾叉即可 三、问答题 4个 30: 有的题可能会画流程图 1、股票 股票交易术语 Order:委托指令Trade:交易Share:股份,代表对公司的部分所有权,分为优先股、普通股、未完全对付股权Share Price:每股价格Sell/Buy:卖/买Ask/Bid:买入报价/卖出报价Spread:价差,某证券当前的买入与卖出价之间的价格差异