我需要帮助编写一些代码来计算N次摇滚剪刀游戏的最大胜利。
我得到的数字是N,即岩纸剪刀游戏的数量,其次是N组整数(1,2,3),每组都链接到岩石,纸张或剪刀。但是,我们不知道哪个数字链接到每个选项。我需要帮助计算第一个人可能赢得的最大游戏数量。
答案 0 :(得分:1)
好吧,让我们考虑如何订购价值的可能情况。我们可以构造一个环,每个数字都会丢失到下一个值。
1 < 2 < 3 < 1
,其中a < b
表示&#34; a反对b&#34; 1 > 2 > 3 > 1
,其中a > b
表示&#34;胜利对抗b&#34; 除了这两个之外没有其他可能性,因为每个号码必须分配一个&#34;赢得&#34;和一个失去的&#34;两个数字池中的数字。因此,我们有两种可能性来将数字排序为获胜/失败条件。
现在我们只需要计算第一个玩家赢得上述配置之一(w
)和抽奖(d
)的次数。因此,使用所选配置的玩家赢得的游戏数量为w
,如果选择了相反的配置,则为N - draws - w
。
int[] A = readPlayerOne();
int[] B = readPlayerTwo();
int draws = 0;
int wins = 0;
for(int i = 0; i < N; i++)
{
if(A[i] == B[i])
draws++;
else if(A[i] - 1 == B[i] || A[i] == 1 && B[i] == 3)
//wins according to the first configuration
wins++;
}
return max(N - draws - wins, wins);
答案 1 :(得分:0)
首先,我们可以忽略具有两个相似数字的行,因为它们会产生平局(不影响分数),您可以使用以下提示:
每一个(摇滚,纸张,剪刀)都有1个输,1个赢和1个平局组合作为例子:
摇滚可以赢得剪刀,从纸上输掉,并用另一块摇滚画,所以如果你假设1-2让玩家1获胜,你可以看出1-3是输了
所以你可以简单地获得它们的最大值
int in[][] = new int[4][4];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
in[i][j] = 0;
for (int i = 0 ; i < N; i++) {
int p1 = scan.nextInt();
int p2 = scan.nextInt();
if(p1 != p2)
in[p1][p2]++;
}
int maxWins = Math.max(in[1][2]+in[2][3]+in[3][1],
in[1][3]+in[2][1]+in[3][2]);