为什么这样做不对?

P5322 [BJOI2019] 排兵布阵

这样做没错呀 ``` #include<iostream> #include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef long long ll; ll s;//除了小C以外的玩家人数 ll n,m;//城堡数和每名玩家拥有的士兵数 ll people;//表示一名玩家的策略 struct NODE { ll soldier; ll point; }l; bool cmp(NODE x,NODE y) { return x.soldier<y.soldier; } vector<NODE> thing[110]; ll dp[200001],ans; int main() { scanf("%lld%lld%lld",&s,&n,&m); ll i,j,k; for(i=1;i<=s;i++) { for(j=1;j<=n;j++) { bool flag=false; ll maxx=0,maxl=-1; scanf("%lld",&people); for(k=0;k<thing[j].size();k++) { if(thing[j][k].soldier==people*2+1) { flag=true; thing[j][k].point+=j; } if(thing[j][k].soldier<people*2+1) { if(maxx<thing[j][k].soldier) { maxx=thing[j][k].soldier;//易错 maxl=k; } } if(thing[j][k].soldier>people*2+1) thing[j][k].point+=j; } if(flag==false) { if(maxl!=-1) l.point=thing[j][maxl].point+j; else l.point=j; l.soldier=people*2+1; thing[j].push_back(l); } } } for(i=1;i<=n;i++) for(j=m;j>=0;j--) for(k=0;k<thing[i].size();k++) { if(j>=thing[i][k].soldier) dp[j]=max(dp[j],dp[j-thing[i][k].soldier]+thing[i][k].point); } for(i=1;i<=m;i++) ans=max(ans,dp[i]); printf("%lld",ans); return 0; } ```
by 詹昕蕾 @ 2021-08-09 19:49:29


|