C# 求给定不等式组有解的最大子集

C# 求给定不等式组有解的最大子集,c#,C#,我是新来的,这是我的第一个问题。所以,直接谈这个话题。 我有一个无法解决的任务,如果有人能为我提供解决方案的方向,我会很高兴。主要的问题是我不能完全理解我的最终输出应该是什么 这就是任务: 给你一组不等式。每个不等式都与变量X有关。确定给定集合中有解的最大子集。 输入文件inqualities.in将包含最多50个不等式的列表,每行一个不等式。每个不等式以下列形式之一给出:“X=C”,其中C是某个整数常数(对于不同的不等式可能不同)。输入数据正确无误,无需明确检查。 在输出文件inquireme

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

这就是任务:

给你一组不等式。每个不等式都与变量X有关。确定给定集合中有解的最大子集。 输入文件inqualities.in将包含最多50个不等式的列表,每行一个不等式。每个不等式以下列形式之一给出:“X=C”,其中C是某个整数常数(对于不同的不等式可能不同)。输入数据正确无误,无需明确检查。 在输出文件inquirements.out的第一行打印整数K:可以同时满足的最大不等式数。在下面的K行上打印找到的不等式集,每行一个不等式,而不管它们的顺序如何

样本输入

X>=3

X<5

X<6

X>=3

X=100

X<3

X>3

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;
  }
 }

}
类程序
{
静态void Main(字符串[]参数)
{
Console.Write(“输入X:”);
intx=int.Parse(Console.ReadLine());
列表结果=Parse.Parse(x);
WriteLine(“\n不等式的计数为:{0}”,result.Count);
foreach(结果中的var项目)
{
控制台写入线(项目);
}
Console.ReadLine();
}
}
公共静态类
{
公共静态列表解析(intx)
{
列表不等式=新列表();
使用(StreamReader=newstreamreader(@“D:Sample.txt”))
{
字符串行=”;
而((line=reader.ReadLine())!=null)
{
字符串[]部分=行分割(“”);
如果(部分[1]=“=”)
{
if(x==转换为32(部分[2]))
{
添加(行);
}
}
否则如果(部分[1]=“>”)
{
如果(x>=转换为32(部分[2]))
{
添加(行);
}
}
如果(部分[1]=“>”),则为else
{
如果(x>转换为32(第[2]部分))
{
添加(行);
}
}

else if(parts[1]==”您所描述的问题是在一条直线上找到一个最大基数。更准确地说,输入的每一行都在实线上描述一个区间。在不丧失一般性的情况下,半闭区间可以被视为闭区间;通过处理输入,最大和最小的边界(比如说
min
max
)可以进行搜索,每个半闭合间隔可以通过如下相应的值闭合

X > C => max + 1 > X > C
X < C => min - 1 < X < C
X>C=>max+1>X>C
Xmin-1
这些区间构成了一个图的节点集;当且仅当两个节点相交时,两个节点通过一条边连接。问题是要在该图中找到一个尽可能大的团,并且在与该图节点相关的区间的相交处可以找到所需的值
X


根据,有一种算法使用运行时绑定的
O(n log n)
来确定基数最大团,尽管在一般图中查找团是非常困难的。

我将创建一个所有发生数的排序列表:-1,3,5,6,100

然后在每个间隔中选择任意X:-1.5、2、4、5.5、50、150

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


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

最大值| X |是否有上界?你能列出所有可能的值并在引入每个必须满足的不等式时将其从列表中删除吗?有点像埃拉托什尼的筛子。我得到的一切都在问题中,所以我对你的问题没有答案:)谢谢你的解释。我没想到这个解决方案会如此复杂(至少对我来说是复杂的):)你能更具体地选择每一个区间中的“任意x”吗?应该如何选择?@ CODOR并不重要。你可以简单地选择有界区间的中心。我不这么认为。考虑区间<代码> [1,3]
[3,5]
[5,7]
;您的建议将检查值
2
4
6
,每个值正好包含在一个间隔中。值
3
5
将分别包含在两个间隔中,但是。@Codor是的,这就是为什么您还需要检查间隔边界的原因。我在您工作时编辑了我的答案正在编写第一条评论。@Henrik,非常感谢。我重新编写了代码,我认为现在我的解决方案是正确的。