1 solutions

  • 0
    @ 2025-11-5 19:35:02

    C++ :

    
    #include<stdio.h>
    using namespace std;
    int a[57],b[37],ansa[57],ansb[37],f,r,f1,r1,f2,r2,i,cnt;
    double sum,tot,ans,c[2017],t;
    void find_r(int k,int step)
    {
      int i,j;
      if (step==r+1)
      {
        if (a[f]*b[r]<3*a[1]*b[1]) return;   //if (a[f]/b[1]<3*a[1]/b
    
    
        cnt=0;
        sum=tot=0;
        for (i=1;i<=f;i++)
          for (j=1;j<=r;j++)
            c[++cnt]=double(a[i])/double(b[j]);
        for (i=1;i<cnt;i++)
          for (j=i+1;j<=cnt;j++)
            if (c[i]>c[j]) {t=c[i];c[i]=c[j];c[j]=t;}
        for (i=1;i<cnt;i++){c[i]=c[i+1]-c[i];sum+=c[i];}
        sum/=--cnt;
        for (i=1;i<=cnt;i++) tot+=(c[i]-sum)*(c[i]-sum);
        if (tot<ans) 
          {
            ans=tot;
            for (i=1;i<=f;i++) ansa[i]=a[i];
            for (i=1;i<=r;i++) ansb[i]=b[i];
          }
        return;
      }
      for (i=k;i<=r2-r+step;i++)
      {
        b[step]=i;
        find_r(i+1,step+1);
      }
    }
    void find_f(int k,int step)
    {
      if (step==f+1){find_r(r1,1);return;}
      for (int i=k;i<=f2-f+step;i++)
      {
        a[step]=i;
        find_f(i+1,step+1);
      }
    }
    int main()
    {
    	
      scanf("%ld%ld",&f,&r);
      scanf("%ld%ld%ld%ld",&f1,&f2,&r1,&r2);
      ans=99999999;
      find_f(f1,1);
      for (i=1;i<f;i++) printf("%ld ",ansa[i]);printf("%ld\n",ansa[f]);
      for (i=1;i<r;i++) printf("%ld ",ansb[i]);printf("%ld\n",ansb[r]);
      //scanf("%ld%ld",&f,&r);
      return 0;
    }
    
    • 1

    Information

    ID
    19419
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By