我刚刚开始了我成为CodeChef上更好的编码器的漫长道路。人们从标记为“易”的问题开始,我也这样做了。数字猜测间隔游戏
问题语句定义如下 - :
n
,其中1 <= n <= 10^9
。这是约翰尼保守秘密的整数。k
,其中1 <= k <= 10^5
。对于每个测试案例或游戏实例,约翰尼精确地向爱丽丝提供k
提示。- 一个提示的形式
op num Yes/No
,其中的 -op
是从<
,>
,=
一个运算符。num
是一个整数,再次满足1 <= num <= 10^9
。Yes
或No
是对问题的回答:关系n op num
是否成立?
- 如果问题的答案是正确的,约翰尼已经说出了一个事实。否则,他在撒谎。
每个提示都反馈给程序,程序确定它是真相还是可能的谎言。我的工作是找到尽可能少的谎言。
现在CodeChef's Editorial answer使用分段树的概念,我根本无法包裹头部。我想知道是否有替代数据结构或方法来解决这个问题,也许是一个简单的问题,因为它在“简单”类别中。
这是我尝试 - :
class Solution //Represents a test case.
{
HashSet<SolutionObj> set = new HashSet<SolutionObj>(); //To prevent duplicates.
BigInteger max = new BigInteger("100000000"); //Max range.
BigInteger min = new BigInteger("1"); //Min range.
int lies = 0; //Lies counter.
void addHint(String s)
{
String[] vals = s.split(" ");
set.add(new SolutionObj(vals[0], vals[1], vals[2]));
}
void testHints()
{
for(SolutionObj obj : set)
{
//Given number is not in range. Lie.
if(obj.bg.compareTo(min) == -1 || obj.bg.compareTo(max) == 1)
{
lies++;
continue;
}
if(obj.yesno)
{
if(obj.operator.equals("<"))
{
max = new BigInteger(obj.bg.toString()); //Change max value
}
else if(obj.operator.equals(">"))
{
min = new BigInteger(obj.bg.toString()); //Change min value
}
}
else
{
//Still to think of this portion.
}
}
}
}
class SolutionObj //Represents a single hint.
{
String operator;
BigInteger bg;
boolean yesno;
SolutionObj(String op, String integer, String yesno)
{
operator = op;
bg = new BigInteger(integer);
if(yesno.toLowerCase().equals("yes"))
this.yesno = true;
else
this.yesno = false;
}
@Override
public boolean equals(Object o)
{
if(o instanceof SolutionObj)
{
SolutionObj s = (SolutionObj) o; //Make the cast
if(this.yesno == s.yesno && this.bg.equals(s.bg)
&& this.operator.equals(s.operator))
return true;
}
return false;
}
@Override
public int hashCode()
{
return this.bg.intValue();
}
}
显然,这部分解决方案是不正确,保存为范围检查,我已经进入if(obj.yesno)
部分之前完成。我正在考虑根据提供的提示更新范围,但这种方法并未取得成果。除了使用细分树之外,我应该如何解决这个问题?
为什么不尝试了解分段树?在不了解分段树,二叉树索引树等基本概念的情况下,不得不进一步深入研究...... –