我该如何处理这个问题?
while(ntestcase--)
{
int i, n, max;
cin >> n;
for(i = 0; i < n; i++)
{
cin >> a;
if(a >= 2)
max += 2;
else
break;
}
cout << "max=" << max << " n=" << n << " i=" << i << "\n";
if(i == n && max != 0)
cout << max << "\n";
else
cout << -1;
}
考虑输入
ntestcase=3
n=5
as a's
1 2 3 4 5
我对问题的基本推论是, 这里输入5个a,但是遇到1时会出现循环中断和输出。 在相同的输入2之后,对于下一个测试用例被认为是'n' 并给出a为3,4和输出,然后n为5。
产生的输出有点像这样:
max=0 n=5 i=0
-1
max=4 n=2 i=2
4
如何解决此问题并将序列(例如:1 2 3 4 5
)视为单个输入?
答案 0 :(得分:0)
看起来您对错误的分析是正确的。
当你突破循环时,未读的输入用于
while(ntestcase--)
的当前迭代遗留下来并且是
用作下一次迭代的输入。
如果是的话,我可能会以非常不同的方式编写所有这些代码
编写我自己的程序(首先,我会避免使用相同的变量i
来计算从输入读取a
的次数和这些变量中有多少次在第一个值小于2)之前,但要继续使用您已选择的样式:
在for
正文的末尾添加另一个while(ntestcase--)
循环
在不做任何其他事情的情况下消耗剩余的迭代输入。
从输入中获取n - i
值,
然后您将为while(ntestcase--)
的下一次迭代做好准备。
例如,这可能会完成这项工作:
int how_many_to_discard = n - i;
for (int j = 0; j < how_many_to_discard; ++j)
{
cin >> a;
}
或者,如果您不想向可能想要调试代码的任何人泄露太多线索,那么循环可能是
for ( ; i < n; ++i)