2706631_tle.cpp

来自「做的POJ的一些题目」· C++ 代码 · 共 112 行

CPP
112
字号
#include<iostream>
using namespace std;
typedef struct
{
      int len;
      int num[101][2];  
      int sign[101];    
}node;
node mg[101];
float maxs=0.0;
int n;
int partion(int row,int left,int right)
{
    int i=left;
    int j=right;
    do{
           i++;
         while(mg[row].num[i][0]>mg[row].num[left][0] || (mg[row].num[i][0]==mg[row].num[left][0]) && mg[row].num[i][1]<mg[row].num[left][1])
              i++;
         while(mg[row].num[j][0]<mg[row].num[left][0] || (mg[row].num[j][0]==mg[row].num[left][0]) && mg[row].num[i][1]>mg[row].num[left][1])
              j--;
         if(i<j)
         {
             int temp=mg[row].num[i][0];
             int temp1=mg[row].num[i][1];
             mg[row].num[i][0]=mg[row].num[j][0];
             mg[row].num[i][1]=mg[row].num[j][1];
             mg[row].num[j][0]=temp;
             mg[row].num[j][1]=temp1;       
         }
         if(i>=j)
         {
             int temp=mg[row].num[left][0];
             int temp1=mg[row].num[left][1];
             mg[row].num[left][0]=mg[row].num[j][0];
             mg[row].num[left][1]=mg[row].num[j][1];
             mg[row].num[j][0]=temp;
             mg[row].num[j][1]=temp1;         
             return j;
         }
      }while(true);    
}
void quicksort(int row,int left,int right)
{
     if(left<right)
     {
        int mid=partion(row,left,right);
         quicksort(row,left,mid-1); 
          quicksort(row,mid+1,right);            
     }
}
void getresult(int k,int min,int sum)
{
    if(k==n)
    {
        float result=float(min)/float(sum);
        if(result>maxs)  
          maxs=result;    
        return;  
    }
    else
    {
         int mins,sums;
         for(int i=0;i<mg[k].len;i++)
         {     
               if(mg[k].sign[i]==0)
               {
                   mins=(mg[k].num[i][0]<min?mg[k].num[i][0]:min);  
                   sums=sum+mg[k].num[i][1];
                   getresult(k+1,mins,sums);
               }
         }    
    }
}
void chuli(int row,int len)
{
     int i=1,pre=0;
     while(i<len)
     {
             if(mg[row].num[i][1]>=mg[row].num[pre][1])
                  mg[row].sign[i]=1;
             else
                pre=i;
             i++;            
     }    
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
         scanf("%d",&n);
         maxs=0;
         for(int i=0;i<n;i++)
         {
              scanf("%d",&mg[i].len);
              for(int j=0;j<mg[i].len;j++)
              {
                  scanf("%d %d",&mg[i].num[j][0],&mg[i].num[j][1]);
                  mg[i].sign[j]=0;
              } 
              quicksort(i,0,mg[i].len-1);
              chuli(i,mg[i].len);
         }    
         getresult(0,1000000,0);
         printf("%.3f\n",maxs);
    }
    system("pause");
    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?