为什么本地对,洛谷判错?

P1209 [USACO1.3] 修理牛棚 Barn Repair

@[Wens](/user/213196) 您的代码我简单做了些修改,不知道是哪个地方导致的错误/kk 反正是过了/kk ```cpp #include<bits/stdc++.h> #define M 600 #define S 2100 // ¿ª´óÊý×é using namespace std; int n,c,m,tot,ans; int f[S]; bool vis[S]; struct node{ int l,r; }line[S]; int main(){ cin>>n>>c>>m; for(int i=1;i<=m;++i){ int x; cin>>x; vis[x]=1; } for(int i=1;i<=c;++i){ if(vis[i]){ ++ans; if(!vis[i-1]) { tot++; // ·ÖÁѳöÀ´tot¼ÆÊý line[tot].l=line[tot].r=i; } if(vis[i-1]) ++line[tot].r; } } for(int i=1;i<=tot-1;++i)f[i]=line[i+1].l-line[i].r-1; sort(f+1,f+tot); int kkk=tot - 1; for(int i=1;i<=tot-1&&kkk>=n;++i) // ÖØËãkkk£¨Ã²ËÆûɶ×÷Óà { ans+=f[i]; kkk--; } cout<<ans<<endl; return 0; } ```
by Maxmilite @ 2020-11-03 08:13:38


中文糊了... ```cpp #include<bits/stdc++.h> #define M 600 #define S 2100 // Expand the Array using namespace std; int n,c,m,tot,ans; int f[S]; bool vis[S]; struct node{ int l,r; }line[S]; int main(){ cin>>n>>c>>m; for(int i=1;i<=m;++i){ int x; cin>>x; vis[x]=1; } for(int i=1;i<=c;++i){ if(vis[i]){ ++ans; if(!vis[i-1]) { tot++; // Let "tot" add 1 independently line[tot].l=line[tot].r=i; } if(vis[i-1]) ++line[tot].r; } } for(int i=1;i<=tot-1;++i)f[i]=line[i+1].l-line[i].r-1; sort(f+1,f+tot); int kkk=tot - 1; for(int i=1;i<=tot-1&&kkk>=n;++i) // It seems that there is no use to modify kkk :( { ans+=f[i]; kkk--; } cout<<ans<<endl; return 0; } ```
by Maxmilite @ 2020-11-03 08:15:45


为什么line[++tot],改成++tot,line[tot],就行了??? 奇妙的错误
by Wens @ 2020-11-03 09:36:50


@[Wens](/user/213196) 请不要让++的变量在同一语句中出现多次
by gxy001 @ 2020-11-03 10:40:44


这样的运算顺序是UB
by gxy001 @ 2020-11-03 10:42:00


哦,谢谢大佬赐教
by Wens @ 2020-11-03 11:03:55


|