【题解】极品飞车

题目描述

Bessie想参加赛车比赛,他的赛车质量是M(1≤M≤1000),马力是F(1≤F≤1000000)。为了提升赛车性能,他可以到加工店添加一些零件。加工店有N(1≤N≤20)种零件,编号1至N,每种零件只有一件。

零件P_i能增加的马力是F_i(1≤F_i≤1000000),它的质量是M_i(1≤M_i≤1000)。根据牛顿第二定理F=MA,( F是力,M是质量,A是加速度)。Bessie想让他的车的加速度最大(如果有多种方案,让赛车的质量最小),他应该配置哪些零件呢?

例如:开始赛车的F=1500,M=100。有4种零件:

i  F_i  M_i

1 250 25

2 150 9

3 120 5

4 200 8

假如只配置零件2,那么加速度将会是:(1500+150)/(100+9)=1650/109=15.13761。

下面的表格用4位二进制数表示配置或不配置零件,得到各种各样的加速度:

状态    F    M    F/M

0000 1500 100 15.0000

0001 1700 108 15.7407

0010 1620 105 15.4286

0011 1820 113 16.1062

0100 1650 109 15.1376

0101 1850 117 15.8120

0110 1770 114 15.5263

0111 1970 122 16.1475 <-- highest F/M

1000 1750 125 14.0000

1001 1950 133 14.6617

1010 1870 130 14.3846

1011 2070 138 15.0000

1100 1900 134 14.1791

1101 2100 142 14.7887

1110 2020 139 14.5324

1111 2220 147 15.1020

因此,应该配置零件2,3,4。

输入输出格式

输入格式:

第一行,三个整数:F,M,N;

第二至N+1行,第i行有两个整数:F_i、M_i。

输出格式:

第一至第P行,P是你要配置的零件的个数。如果不需要配置,则输出NONE。否则从小到大输出你配置的零件的下标。答案是唯一的。

输入输出样例

输入样例:
1500 100 4
250 25
150 9
120 5
200 8
输出样例:
2
3
4
我们可以用二进制枚举求出它的全排列,再一个个判断
具体程序如下:
#include<iostream>
using namespace std;
int f,m,n,array[25],memory,ans[25];
typedef struct
{
    int force;
    int weight;
    float speed;
}node;
node con[25];
void add(int r,int n,int st)
{
    while(array[r]>n)
    {
        --array[r];
        ++array[r-1];
        --r;
        --n;
    }
    for(register int i=r+1;i<=st;++i) array[i]=array[i-1]+1;
}
float maxx;
int main()
{
    cin>>f>>m>>n;
    for(register int i=1;i<=n;++i)
    {
        cin>>con[i].force>>con[i].weight;
        con[i].speed=float(con[i].force+f)/(con[i].weight+m);
    }
    for(register int i=1;i<n;++i)
    {
        float maxf=f;
        float maxm=m;
        for(register int j=0;j<=i;++j)
        {
            array[j]=j;
            maxf+=con[array[j]].force;
            maxm+=con[array[j]].weight;
        }
        if(float(maxf/maxm)>maxx)
        {
            maxx=float(maxf/maxm);
            for(register int j=1;j<=i;++j) ans[j]=array[j];
            memory=i;
        }
        maxf=f;
        maxm=m;
        while(array[0]==0)
        {
            maxf=f;
            maxm=m;
            ++array[i];
            add(i,n,i);
            if(array[0]!=0) break;
            for(register int j=1;j<=i;++j)
            {
                maxf+=con[array[j]].force;
                maxm+=con[array[j]].weight;
            }
            if(float(maxf/maxm)>float(maxx))
            {
                maxx=float(maxf/maxm);
                for(register int j=1;j<=i;++j) ans[j]=array[j];
                memory=i;
            }
        }
    } 
    if(f/m>maxx)
    {
        cout<<"NONE";
        return 0;
    }
    for(register int i=1;i<=memory;++i) cout<<ans[i]<<endl;
}

 

 
posted @ 2019-04-09 14:18  X_OR  阅读(172)  评论(0编辑  收藏  举报