震惊!c++与pascal的一模一样程序竟然结果天差地别!

P1064 [NOIP2006 提高组] 金明的预算方案

笨笨猪 @ 2017-01-13 12:45:51

震惊!c++与pascal的一模一样程序竟然结果天差地别!(p1064金明的预算方案)

作为一名写C++的学生在做题时发现了题解中有一篇Pascal代码中使用了十分巧妙的位运算方法来给主件和附件分组,于是模仿着使用c++进行编写。

可是十分曲折,调试了很久提交了n次还是不过,很生气!

于是气急败坏的把pascal交了上去,ac了,然后把c++的.一模一样的代码(连变量名都一样!)交了上去,0分!!(毕竟连样例都过不了)

自己和同学加起来核对了十多遍,真心不知道为什么?

求大神解答!谢谢各位!【有图有真相】

#include<cstdio>
#include<algorithm>
using namespace std;
int i,j,k,m,n,x,t,ww,vv,w[100010],v[100010],a[1000][10],f[100010],cap;
bool boo[100010];
int main()
{
    scanf("%d%d",&cap,&n);
    for (i=1;i<=n;++i)
    {
        scanf("%d%d%d",&w[i],&v[i],&x);
        v[i]=v[i]*w[i];
        if (x==0) continue;
        boo[i]=true;
        ++a[x][0];
        a[x][a[x][0]]=i;
    }

    for (i=1;i<=n;++i)

        if (!boo[i])
            for (j=cap;j>=w[i];--j)
            {
                for (k=0;k<=(1<<a[i][0]-1);++k)
                {
                    ww=0;
                    vv=0;
                    for (t=1;t<=a[i][0];++t)
                    if (((k>>(t-1))and 1)==1) 
                    {
                        ww+=w[a[i][t]];
                        vv+=v[a[i][t]];
                    }
                    if (j>=ww+w[i]) f[j]=max(f[j],f[j-ww-w[i]]+vv+v[i]);
                }
            }
    printf("%d\n",f[cap]);
    return 0;
}

然后是题解中的Pascal代码

var
i,j,t,k,x,ww,vv,n,cap:longint;
w,v,f:array[0..100010] of longint;
a:array[0..1000,0..10] of longint;
boo:array[0..100010] of boolean;

function max(x,y:longint):longint;
begin
    if x>y then exit(x);exit(y);
end;

begin
    readln(cap,n);
    for i:=1 to n do
    begin
        readln(w[i],v[i],x);
        v[i]:=v[i]*w[i];
        if x=0 then continue;
        boo[i]:=true;
        inc(a[x,0]);a[x,a[x,0]]:=i;
    end;

    for i:=1 to n do
    if not boo[i] then
    for j:=cap downto w[i] do
    begin
        for k:=0 to 1<<a[i,0]-1 do
        begin
            ww:=0;vv:=0;
            for t:=1 to a[i,0] do
            if (k>>(t-1))and 1=1 then 
            begin inc(ww,w[a[i,t]]);inc(vv,v[a[i,t]]);end;
            if j>=ww+w[i] then f[j]:=max(f[j],f[j-ww-w[i]]+vv+v[i]);
        end;
    end;
    writeln(f[cap]);
end.

求教了!


by 飞翔 @ 2017-01-13 13:23:14

@笨笨猪 我对C++的位运算不是很了解,我感觉是C++和Pascal同样的运算符表示的含义不同吧。既然对过10来遍我相信没什么大问题。

还有建议把++i全部改成i++试试(仅仅是建议,可能还是不行)


by lemonoil @ 2017-01-13 15:11:31

其实本来Pascal的运行速度是快与G++或GCC的,并且Pascal的默认与c++有区别


by stealthassassin @ 2017-01-13 17:18:43

c++里面没有and运算吧,请使用&,这个符号表示Pascal中的and


by stealthassassin @ 2017-01-13 17:29:25

哦,是因为for (k=0;k<=(1<<a[i][0]-1);++k)这句话的问题,c++中位运算的优先级很低,这样算的结果是1<<(a[i][0]-1)


by stealthassassin @ 2017-01-13 17:47:18

@ 笨笨猪


by 1124828077ccj @ 2017-01-13 21:43:30

@笨笨猪 有人叫你


by 笨笨猪 @ 2017-01-13 22:21:08

是的,谢谢各位,问题已经解决了。

@stealthassassin 谢谢你的帮助,是我太粗心了

的确是是因为for (k=0;k<=(1<<a[i][0]-1);++k)这句话的问题

改成for (k=0;k<=((1<<a[i][0])-1);++k)就通过了。

也提醒大家要注意优先级的问题!谢谢各位帮助!

@飞翔

@lemonoil

@2016陈常杰


by 飞翔 @ 2017-01-16 13:24:15

果然坑那


by HT008 @ 2017-02-07 10:05:35

uc需要你


by burningdian @ 2017-02-28 17:52:02

继续努力,还和UC有点差距


| 下一页