2 条题解

  • 0
    @ 2025-10-8 17:12:25

    tjh:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const double eps=1e-5;
    int n,W;
    long double b[255],a[255],dp[1010];
    struct N{
        long double x;
        ll w;
    }c[255];
    bool cmp(N a,N b){
        if(fabs(a.x-b.x)>eps&&max(a.x,b.x)>0)return a.x<b.x;
        if(fabs(a.x*b.w-b.x*a.w)>eps)return a.x*b.w<b.x*a.w;
        return a.w<b.w;
    }
    bool check(long double L){
        for(int i=1;i<=n;i++)c[i]={a[i]-L*b[i],b[i]};
        for(int i=1;i<=W;i++)dp[i]=-1e18;
        for(int i=1;i<=n;i++){
            for(int j=W;j>=0;j--){
                int jj=j+c[i].w;
                if(jj>W)jj=W;
                dp[jj]=max(dp[jj],dp[j]+c[i].x);
            }
        }
        return dp[W]>=0;
    }
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);
        cin>>n>>W;
        for(int i=1;i<=n;i++)cin>>b[i]>>a[i];
        long double l=0,r=1000;
        while(r-l>eps){
            long double mid=(l+r)/2;
            if(check(mid))l=mid;
            else r=mid;
        }
        cout<<(int)((l+eps)*1000);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:12:09

      tjh:

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      const double eps=1e-5;
      int n,W;
      long double b[255],a[255],dp[1010];
      struct N{
      long double x;
      ll w;
      }c[255];
      bool cmp(N a,N b){
      if(fabs(a.x-b.x)>eps&&max(a.x,b.x)>0)return a.x<b.x;
      if(fabs(a.xb.w-b.xa.w)>eps)return a.xb.w<b.xa.w;
      return a.w<b.w;
      }
      bool check(long double L){
      for(int i=1;i<=n;i++)c[i]={a[i]-L*b[i],b[i]};
      for(int i=1;i<=W;i++)dp[i]=-1e18;
      for(int i=1;i<=n;i++){
      for(int j=W;j>=0;j--){
      int jj=j+c[i].w;
      if(jj>W)jj=W;
      dp[jj]=max(dp[jj],dp[j]+c[i].x);
      }
      }
      return dp[W]>=0;
      }
      int main(){
      ios::sync_with_stdio(0);
      cin.tie(0);
      cin>>n>>W;
      for(int i=1;i<=n;i++)cin>>b[i]>>a[i];
      long double l=0,r=1000;
      while(r-l>eps){
      long double mid=(l+r)/2;
      if(check(mid))l=mid;
      else r=mid;
      }
      cout<<(int)((l+eps)*1000);
      return 0;
      }

      • 1

      *【01分数规划】[USACO18OPEN] Talent Show G

      信息

      ID
      6795
      时间
      1000ms
      内存
      128MiB
      难度
      7
      标签
      递交数
      75
      已通过
      15
      上传者