萌新求助
查看原帖
萌新求助
236929
Monaco楼主2022/1/16 14:25
#include<bits/stdc++.h>
using namespace std;
const int N=10005,M=1005; 
int up[N],down[N],Max[N],Min[N];int dp[N][M]; 
inline int cll(int x,int y)
{
  if(x%y==0)return x/y;
  else return x/y+1;
}const int INF=0x3f3f3f3f; 
int main()
{
  int n,m,t;
  cin>>n>>m>>t;
  for(int i=0;i<n;++i)
  {
    cin>>up[i]>>down[i];
    Max[i]=m,Min[i]=1;
  } 
  for(int i=1;i<=t;++i)
  {
    int ret,l,r; cin>>ret>>l>>r;  
    Max[ret]=min(Max[ret],r-1),Min[ret]=max(Min[ret],l+1);
  }
  memset(dp,0x3f,sizeof(dp));  //cout<<"Test: "<<dp[0][0]<<endl; 
  for(int i=Min[0];i<=Max[0];++i) dp[0][i]=0;  
  for(int i=1;i<n;++i)
  {
    for(int j=Min[i];j<=Max[i];++j)
    {
      if(j+down[i-1]>=Min[i-1]&&j+down[i-1]<=Max[i-1]) 
      {
        dp[i][j]=min(dp[i][j],dp[i-1][j+down[i-1]]);
      }
      for(int k=1;;++k)
      {
        if(j-up[i-1]*k<Min[i-1])break;
        if(j-up[i-1]*k>Max[i-1])continue;
        dp[i][j]=min(dp[i][j],dp[i-1][j-up[i-1]*k]+k); 
      }
    }
    if(Max[i]==m)
    {
      for(int j=Min[i-1];j<=Max[i-1];++j)
      {
        dp[i][m]=min(dp[i][m],dp[i-1][j]+cll(m-j,up[i-1]));
      }
    }
  }
  int ans=INF;
  for(int i=Min[n-1];i<=Max[n-1];++i)ans=min(ans,dp[n-1][i]);
  if(ans!=INF) cout<<"1"<<endl<<ans<<endl;
  else
  {
    for(int i=n-1;i>=0;--i)
    {
      int ret=INF; 
      for(int j=Min[i];j<=Max[i];++j) ret=min(ret,dp[i][j]);
      if(ret!=INF) 
      {
        cout<<"0"<<endl<<i+1<<endl;
        break; 
      }
    }
  }
  return 0;
}

样例都过不了,越改越离谱。。。。

2022/1/16 14:25
加载中...