我是新来的,这是我的第一个问题。所以,直接就这个话题。 我有一个我无法解决的任务,如果有人可以向我提供解决方案的指示,我会很高兴。主要问题是我无法完全理解应该是我的最终输出。
这是任务:
你被赋予了一系列不平等。每个不等式都指变量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;
}
}
}
这是一个解决方案,但显然不是应该提供的解决方案。 可能我必须从不同的角度看,但我缺乏想法。
我的英语不是很好,但我希望你理解我,
由于
答案 0 :(得分:0)
您所描述的问题是在clique中找到基数最大interval graph。更确切地说,输入的每一行都描述了实线上的间隔。不失一般性,半封闭间隔可视为封闭间隔;通过处理输入,可以搜索最大和最小边界(比如min
和max
),每个半闭区间可以按相应的值关闭,如下所示。
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个不等式,这可能足够好(并且更简单)。