ZOJ 1003
2015-04-05 12:57
323 查看
这也是一个搜索的问题,搜索两人分数的所有分解方法。当两者的所有分解方式中,都必须使用到某个或某几个相同的因子时,说明报高分的人在撒谎。换句话说,如果两人的分数能够在不占用对方因子的情况下成功分解,那么报高分的人没有撒谎!
注意考虑特殊情况,如果较低分数本身不可能被1到100内的整数分解,那么高分赢,因为在这时,挑战者自己就把自己的分数算错了!
用全局变量记录状态,然后递归时不断刷新状态。不要忘记每次循环时将状态设为0!
话说,为什么代码片没有C语言的呀,虽然C++也可以,但是还是觉得不爽ing。
注意考虑特殊情况,如果较低分数本身不可能被1到100内的整数分解,那么高分赢,因为在这时,挑战者自己就把自己的分数算错了!
#include<stdio.h> void factoring(int max,int min,int now); int flag1,flag2,ret; //flag1==1表示大数可分解,flag2==1表示小数可分解, //flag1和flag2保存的状态不保证在受对方干扰下也是如此 int main() //ret表示在不占用对方因子时,两者中成功分解的个数 { int a,b; while(scanf("%d %d",&a,&b)!=EOF) { int min,max; flag1 = flag2 = 0; ret = 0; max = a>b?a:b; min = a<b?a:b; factoring(max,min,2); if(ret==1&&flag2==1) //不占用对方因子时只能有一个数分解成功,而且小数 { //可分解,此时挑战成功! printf("%d\n",min); } else { printf("%d\n",max); } } return 0; } void factoring(int max,int min,int now) { if(now>100) return; else { int i = 0,j = 0; if(max==1) { flag1 = 1; i = 1; } if(min==1) { flag2 = 1; j = 1; } ret = (i+j)>ret?(i+j):ret; //更新ret if(max%now==0) //不同时使用当前因子now,保证不占用对方因子! factoring(max/now,min,now+1); if(min%now==0) factoring(max,min/now,now+1); factoring(max,min,now+1); } }
用全局变量记录状态,然后递归时不断刷新状态。不要忘记每次循环时将状态设为0!
话说,为什么代码片没有C语言的呀,虽然C++也可以,但是还是觉得不爽ing。
相关文章推荐
- zoj 1003 Crashing Balloon(整数分解应用)
- 浙江大学ZOJ 1003题 详解
- ZOJ 1003 Crashing Balloon(DFS)
- ZOJ 1003 Crashing Balloon
- ZOJ 1003 Wrong Answer!高手们帮下忙
- ZOJ_1003
- ZOJ1003
- ZOJ1003 Crashing Balloon
- ZOJ 1003 Crashing Ballon
- zoj 1003 Crashing Balloon
- ZOJ 1003
- ZOJ1003-Crashing Balloon
- ZOJ/ZJU 1003
- ZOJ 1003 Crashing Balloon
- ZOJ1003 Crashing Balloon
- ZOJ 1003 Crashing Balloon
- ZOJ 1003 Crashing Balloon
- ZOJ 1003 Crashing Balloon
- zoj 1003 Crashing Balloon(两次dfs)
- ZOJ1003 Crashing Balloon