初中生一枚。noip2013年第3题,小朋友的数字,帮忙看看,被坑了好久。

第一个代码调了很久还是80分,加完了最后取模,第二个代码是AC的,一边加一边取模。但是不知道这两个代码原理有什么大区别,错的两个点是为什么?谢谢了
第一个:

for i:=2 to n-1 do

if b[i]>0 then max:=max+b[i];
if max<b[1] then max:=b[1];
writeln(max mod p);
第二个:
f:=true;
for i:=2 to n-1 do
begin
if b[i]>0 then
begin
if not(f) then max:=(max+b[i]) mod p
else max:=max+b[i];
if max>b[1] then f:=false;
end;
end;
if not f then writeln(max)
else writeln(b[1] mod p);

这两个程序并没有原理上的区别。后面两个点wa的原因我觉得是前一个程序在计算过程中爆了你设置的数据范围,比如爆了maxlongint。不过两个程序还是略有不同,第二个跑的应该快一些,因为第二个相当于设置了一个中途退出的机制,后面一半(当max>b[1]时)虽然在循环但没有做操作……简单的递推……追问

那两个点WA,就是有答案输出来,没有爆范围。

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-08-02
这明显是爆掉long long 了,有答案输出不代表没有溢出,溢出之后会变成负数,所以你的答案就是最大的没有溢出的

Warning: Invalid argument supplied for foreach() in /www/wwwroot/aolonic.com/skin/templets/default/contents.html on line 45
相似回答