网球锦标赛算法

时间:2012-04-25 20:40:12

标签: java algorithm

在网球锦标赛结束后,每个球员被问到他有多少场比赛。 运动员不能与另一名运动员进行多场比赛。 作为输入,你唯一拥有的是运动员的数量和每个运动员的比赛。作为输出,如果比赛可以根据运动员的答案进行,你将获得1,如果不是,则为0。例如:

Input: 4 3 3 3 3      Output: 1  
Input: 6 2 4 5 5 2 1  Output: 0  
Input: 2 1 1          Output: 1  
Input: 1 0            Output: 0  
Input: 3 1 1 1        Output: 0  
Input: 3 2 2 0        Output: 0  
Input: 3 4 3 2        Output: 0  

输入的第一个数字不是运动员的一部分回答它是参加比赛的运动员数量,例如6 2 4 5 5 2 1我们有6名运动员参加,他们的答案是2 4 5 5 2 1。

到目前为止,这是我们写的,但效果不好:

import java.util.Scanner;
import java.util.Arrays;

public class Tennis {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        String N;
        int count;
        int sum = 0;
        int max;
        int activeAthletes;
        int flag;

        System.out.printf("Give: ");
        N = input.nextLine();

        String[] arr = N.split(" ");
        int[] array = new int[arr.length];

        for (count = 0; count < arr.length; count++) {
            array[count] = Integer.parseInt(arr[count]);
            //System.out.print(arr[count] + " ");
        }

        for (count = 1; count < arr.length; count++) {
            sum += array[count];
        }
        //System.out.println("\n" + sum);

        activeAthletes = array[0];

        for (count = 1; count < array.length; count++) {
            if (array[count] == 0) {
                activeAthletes--;
            }
        }

        max = array[1];
        for (count = 2; count < array.length; count++) {
            if (array[count] > max) {
                max = array[count];
            }
        }
       // System.out.println(max);

        if ((sum % 2 == 0) && (max < activeAthletes)) {            
            flag = 1;
        } else{
            flag = 0;
        }

        System.out.println(flag);
    }
}

我不想要一个直接的解决方案,也许只是一些提示和提示,因为我们真的不知道还有什么要做,我重复,即使我将它标记为作业(因为我觉得主持人会再次关闭它)它不是,这只是我兄弟找到的东西,我们正在努力解决。

很多人都回答了,我真的很感激,但是因为我明天有工作需要去睡觉,所以我明天可能会看到其余的答案,看看有什么用。

5 个答案:

答案 0 :(得分:7)

不确定它是否100%有效,我会像:

  1. 排序输入
  2. 对于数组中从右到左的每个元素(从大到小)

    • 基于索引i处的元素的值n将n个左元素减少1
    • 如果由于您到达列表末尾或值0 而无法减少,则
    • 返回失败
  3. 返回成功。

  4. 这个逻辑(如果正确的话)可以对O(N * log(N))解决方案进行一些修改,但我现在认为这对新手程序员来说太过分了。

    修改

    这在输入上无效 2 2 1 1

    然后所有步骤(白色排序):

    1. ,而列表L中的任何元素都不是0:

      • 在列表L中找到最大元素N
      • 如果值> = 1,则将列表L中的N个其他值减1(不要减小此最大元素)
        • 如果在此步骤失败则返回失败
      • 将此元素N设置为0
    2. 返回确定

答案 1 :(得分:5)

这是一个提示。回答这些问题

  1. 鉴于N名运动员,最大匹配数是多少?
  2. 鉴于运动员X,他可以做的最大匹配数是多少?
  3. 这足以检查这些吗?如果您不确定,请尝试编写程序以生成每个可能的玩家匹配,并检查是否至少有一个满足输入。这只适用于少量的运动员,但这是一个很好的练习。或者只是手工完成
  4. 提出这个问题的另一种方法是,我们可以创建一个1s和0s的对称矩阵,其行与值相等。这将是'谁扮演谁'的表。想象这就像一个N×N网格,其中grid [i] [j] = grid [j] [i](如果你扮演他们玩你的人)和grid [i] [i] = 0(没有人自己玩)

    例如

    Input: 4 3 3 3 3 Output: 1
    

    看起来像

     0 1 1 1
     1 0 1 1
     1 1 0 1
     1 1 1 0 
    

    我们不能用这个做到这一点,但是:     输入:3 2 2 0输出:0

    修改

    这相当于此(来自Degree (graph theory)

      

    Hakimi(1962)证明(d1,d2,...,dn)是一个度数序列   简单的图形当且仅当(d2 - 1,d3 - 1,...,dd1 + 1 - 1,dd1 + 2,   dd1 + 3,...,dn)是。这一事实导致了一种简单的查找算法   一个具有给定可实现程度序列的简单图:

         
        
    1. 从没有边缘的图表开始。
    2.   
    3. 维持一个顶点列表,其中的度数要求尚未按剩余度要求的非递增顺序得到满足。
    4.   
    5. 将第一个顶点连接到此列表中的下一个 d1 顶点,然后将其从列表中删除。重新排序列表并重复直到所有   学位要求得到满足。
    6.         

      查找或估计给定图形数量的问题   度序列是graph enumeration领域的一个问题。

答案 2 :(得分:2)

也许你可以选择一系列运动员&#39;匹配qties,并确定那里的最大数字。

然后看看你是否可以将该数字拆分为1并从数组的其他几个成员中减去那些1。

将最大数字数组成员清空,并将其从数组中删除,并使用减少的值更新其他成员。

现在,重复该过程 - 确定新的最大数字,并从数组的其他成员中减去它。

如果在任何时候没有足够的数组成员从中减去1,那么让应用程序返回0.否则继续执行它直到数组中没有更多成员,此时你可以拥有该应用程序返回1.

另外,请记住删除减少到零的数组成员。

答案 3 :(得分:0)

编辑:以下解决方案将一些无效输入传递为有效。这是检查明确否定的快速方法,但它允许误报。


以下是数学家的建议:

  1. 匹配数的总和必须是偶数。 3 3 4 2 1总和为13,这意味着有人与自己进行了比赛。
  2. 对于n玩家,如果每场比赛至少消除一名玩家n-1必须进行不同的比赛。 (淘汰赛。)为了看到这一点,为2,4,8,16,32 ......球员画一个比赛树,需要1,3,7,31 ......比赛来决定胜利者。
  3. 对于n玩家,假设没有重复匹配,每个人每次播放一次的最大匹配数为n choose 2(n!)/(2!)(n-2)!(循环赛锦标赛)。 n!是阶乘函数,n! = n * n-1 * n-2 * ... * 3 * 2 * 1.
  4. 所以标准是:

    1. 匹配数的总和必须是偶数。
    2. 匹配数的总和必须至少为2n-2。 (注意乘以2 - 每次匹配都会导致两个玩家将其数量增加一个。)
    3. 匹配数总和最多为2 * n choose 2
    4. [编辑]每位玩家必须参加至少一场比赛。
    5. 如果您的锦标赛是淘汰赛和循环赛之间的交叉,那么您可以在n-1n choose 2场比赛之间。

      编辑:

      如果任何玩家玩的次数超过n-1次,他们至少会玩两次。

      如果您的锦标赛是订购的淘汰赛,以便每位玩家参加尽可能少的比赛,那么每位玩家最多只能参加log_2(n)场比赛(以log基地2和圆形在一场有16名球员的比赛中,最多4场比赛。在1024场比赛的比赛中,最多10场比赛。

答案 4 :(得分:0)

通过计算匹配并查看它们是否除以2,可以轻松解决您的示例。

您的示例未涵盖的问题是玩家,其游戏的数量超过其他玩家的总和:

  • 输入:4 5 1 1 1输出:0

如果我们添加更多玩家,这可能很复杂:

  • 输入:6 5 5 5 1 1 1输出:0

如何解决这个问题?好吧,从最大和最小玩家中成对删除一个游戏,看看会发生什么:

  • 输入:6 5 5 5 1 1 1
  • 输入:5 5 5 4 1 1 -
  • 输入:4 5 4 4 1 - -
  • 输入:3 4 4 4 - - -

违反了规则:

  

运动员不能与另一名运动员进行多场比赛。

如果剩下3名球员,他们每场比赛不能超过2场。