【发布时间】:2014-07-27 17:03:16
【问题描述】:
以下问题来自最近的一次编程竞赛。
GCD 游戏
生与死,输赢 - 双方都有对方。这就是 Arjit 和 Chandu Don 争论的焦点。他们厌倦了彼此之间的帮派战争,因此决定像男人一样定居在数学领域。
但即使是去玩数学游戏,他们也没有放弃互相伤害的战术。所以,Arjit 随身携带了数颗橡皮子弹,Chandu Don 携带了 b 颗橡皮子弹。既然小昌杜是两人中比较危险的黑帮,他决定把第一次机会给阿吉特。
他们决定谁赢得整个 HEpur 土地的方式是玩古老的 GCD-DCG 游戏。第一个最终只有 1 颗子弹的子弹将会失败。
游戏是这样进行的:
1. If GCD (a, b) is greater than 1, then, the player can:
a.) Subtract 1 from opposite player’s bullets. **OR**
b.) Divide the number of bullets of opposite player by GCD (a, b).
2. If GCD (a, b) is equal to 1, then, the player can:
a.) Subtract 1 from the opposite player’s bullets.
Note : Player can choose only one move out of two if GCD(A,B) > 1 .
The one who ends up with only one bullet loses the battle,
and his life, and the land of HEpur.
一劳永逸地决定谁来统治!
输入:
第一行包含测试用例的数量 T,接下来的 T 行包含 Arjit 和 Chandu Don 分别取的两个数字 A 和 B。
输出:
在抽签的情况下打印比赛获胜者的姓名。
约束
1 <= T <= 1000
1 <= A <= 1000
1 <= B <= 1000
问题陈述来源:Arjit Srivastava。
Sample Input
4
2 1
3 4
5 5
1 1
Sample Output
Arjit
Chandu Don
Arjit
Draw
我在这里添加我的解决方案:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class TestClass
{
public static void main(String args[] ) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int noOfTestCases = Integer.parseInt( br.readLine() );
for( int inx = 0; inx < noOfTestCases; ++inx )
{
StringTokenizer st = new StringTokenizer( br.readLine() );
int a = 0;
int b = 0;
while( st.hasMoreTokens())
{
a = Integer.parseInt( st.nextToken() );
b = Integer.parseInt( st.nextToken() );
}
doStuff( a, b, true);
}
}
private static boolean doStuff(int a, int b, boolean arjitInPlay )
{
if( a == 1 && b == 1 )
{
System.out.println( "Draw" );
return true;
}
if( a == 1 )
{
System.out.println( "Chandu Don" );
return true;
}
if( b == 1 )
{
System.out.println( "Arjit" );
return true;
}
int result = getGCD( a, b );
if( arjitInPlay )
{
if( result > 1 )
{
return doStuff( a, b - 1, !arjitInPlay ) || doStuff( a, b / result, !arjitInPlay );
}
else if ( result == 1 )
{
return doStuff( a, b - 1, !arjitInPlay );
}
}
else
{
if( result > 1 )
{
return doStuff( a - 1, b, !arjitInPlay ) || doStuff( a / result, b, !arjitInPlay );
}
else if ( result == 1 )
{
return doStuff( a - 1, b, !arjitInPlay );
}
}
return false;
}
private static int getGCD(int a, int b)
{
if (b == 0)
{
return a;
}
return getGCD(b, a % b);
}
}
我有两个问题:
- 递归是可以在这里使用的最佳数据结构吗?还是这需要另一个数据结构或算法类。
- 有一个概念叫做正确修剪。在确定它们不会产生好的结果后,很少有路径被切断。有人可以帮我如何修剪上面的代码[比短路更好]。
- 此代码可能有什么问题? 3 个测试中有 1 个通过。其他两个都失败了。
谢谢, 帕万。
【问题讨论】:
-
如果您提供了失败的测试,而不是让我们都猜测,这将很有帮助。
-
@DavidWallace 恐怕这是不可能的。问题是它们是未公开的竞赛测试用例。
-
所以你基本上是在要求 SO 社区为你测试你的代码,并告诉你错误是什么?我认为没有人真的有时间这样做,但我可能错了。如果你能具体说明失败的具体原因,那么几乎肯定会有人告诉你原因。但以目前的形式,我认为你根本不会得到任何问题的答案。
标签: java algorithm recursion dynamic-programming