寻找具有解决方案的给定不等式集的最大子集

时间:2017-02-16 12:23:03

标签: c#

我是新来的,这是我的第一个问题。所以,直接就这个话题。 我有一个我无法解决的任务,如果有人可以向我提供解决方案的指示,我会很高兴。主要问题是我无法完全理解应该是我的最终输出。

这是任务:

你被赋予了一系列不平等。每个不等式都指变量X.确定具有解的给定集的最大子集。 输入文件inequalities.in将包含最多50个不等式的列表,每行一个不等式。每个不等式以下列形式之一给出:“X< C“,”X< = C“,”X = C“,”X> C“或”X> = C“,其中C是某个整数常数(对于不同的不等式可能不同)。输入数据是正确的,不需要明确检查。 在输出文件的第一行inequalities.out打印整数K:可以同时满足的最大不等式数。在下面的K行中打印出一组不等式,每行不等式,不管它们的顺序如何。

示例输入

X> = 3

X< 5

X< 6

X> = 3

X = 100

X< 3

X> 3

X< = -1

示例输出

5

X> = 3

X< 5

X< 6

X> = 3

X> 3

解释

如果X = 4,则满足这五个不等式。没有更大的子集有解决方案。

这是我的代码:

class Program
{
 static void Main(string[] args)
 {
  Console.Write("Enter X: ");
  int x = int.Parse(Console.ReadLine());
  List<string> result = ParseInequalities.Parse(x);

  Console.WriteLine("\nCount of inequalities is: {0}", result.Count);
  foreach (var item in result)
  {
   Console.WriteLine(item);
  }

 Console.ReadLine();
 }
}

public static class ParseInequalities
{
 public static List<string> Parse(int x)
 {
  List<string> inequalities = new List<string>();
  using (StreamReader reader = new StreamReader(@"D:Sample.txt"))
  {
   string line = "";
   while ((line = reader.ReadLine()) != null)
   {
    string[] parts = line.Split(' ');

    if (parts[1] == "=")
    {
      if (x == Convert.ToInt32(parts[2]))
      {
       inequalities.Add(line);
      }
    }
    else if (parts[1] == ">=")
    {
     if (x >= Convert.ToInt32(parts[2]))
     {
      inequalities.Add(line);
     }
    }
    else if (parts[1] == ">")
    {
     if (x > Convert.ToInt32(parts[2]))
     {
      inequalities.Add(line);
     }
    }
    else if (parts[1] == "<")
    {
     if (x < Convert.ToInt32(parts[2]))
     {
      inequalities.Add(line);
     }
    }
    else if (parts[1] == "<=")
    {
     if (x <= Convert.ToInt32(parts[2]))
     {
      inequalities.Add(line);
     }
    }

  }
  return inequalities;
  }
 }

}

这是一个解决方案,但显然不是应该提供的解决方案。 可能我必须从不同的角度看,但我缺乏想法。

我的英语不是很好,但我希望你理解我,

由于

2 个答案:

答案 0 :(得分:0)

您所描述的问题是在clique中找到基数最大interval graph。更确切地说,输入的每一行都描述了实线上的间隔。不失一般性,半封闭间隔可视为封闭间隔;通过处理输入,可以搜索最大和最小边界(比如minmax),每个半闭区间可以按相应的值关闭,如下所示。

X > C => max + 1 > X > C
X < C => min - 1 < X < C

这些间隔构成图的节点集;当且仅当它们相交时,两个节点通过边连接。问题是在此图中找到尽可能大的集团,并且可以在与图的节点相关联的间隔的交集中找到期望值X

根据this publication,有一个运行时绑定O(n log n)的算法来确定基数 - 最大集团,尽管在一般图表中找到一个集团是NP-hard

答案 1 :(得分:0)

我会创建一个所有出现数字的排序列表:-1,3,5,6,100

然后在每个区间中选择一个任意的X:-1.5,2,4,5.5,50,150

对于两个列表中的所有数字,检查哪一个满足最不平等。

运行时是O(n ^ 2)而不是O(n logn),但对于50个不等式,这可能足够好(并且更简单)。