竞选总统 WA30pts 求调



#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,sum,x[105],y[105],z[105];
ll f[105][100005];
//f[i][j] 表示小信前 i 个选区获得 j 票,最少得有多少人从小友转向小信
int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;i++) scanf("%d%d%d",&x[i],&y[i],&z[i]);
  memset(f,-0x3f,sizeof(f));
  f[0][0]=0;
  for(int i=1;i<=n;i++){
    sum+=z[i];
    for(int j=0;j<=sum;j++) f[i][j]=f[i-1][j];
    if(x[i]>y[i]){
      for(int j=z[i];j<=sum;j++) f[i][j]=f[i-1][j-z[i]];
    }
    else{
      for(int j=z[i];j<=sum;j++){
        f[i][j]=max(f[i-1][j],f[i-1][j-z[i]]+(y[i]-x[i]+1)/2);
      }
    }
  }
  for(int i=(sum+1)/2;i<=sum;i++){
    if(f[n][i]!=f[0][1]){
      printf("%lld",f[n][i]);
      return 0;
    }
  }
  return 0;
}

应该是这里

f[i][j]=max(f[i-1][j],f[i-1][j-z[i]]+(y[i]-x[i]+1)/2);

这里(y[i]-x[i]+1)/2可能会是负数,要与0取最大值(可能不对)

else 的时候说明 y_i>x_i 啊,你再看看

那里要取min吧

不对啊,小信最多可以获得1e9张票,会爆空间,dp需要重构

屏幕截图 2025-02-06 094347

答案因该是(sum+1)/2~sum中的最小值,还有,dp转移公式需要取min

初始化写多少

0x3f

过了吗?

不是会超过1e9吗

0x3f吗?

A了,谢谢
@稻叶昙 关帖