zoukankan      html  css  js  c++  java
  • 【题解】极品飞车

    题目描述

    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;
    }
     
  • 相关阅读:
    浅谈iOS7 AVFoundation 二维码扫描
    使用ZBarSDK生成和读取二维码
    NSURLConnection与NSURLSession大比拼
    iOS开发------之runtime的运用-类与对象&&&获取当前网络状态
    XML之解析------使用NSXMLPaser(SAX)和GDataXML(DOM)
    Beta阶段项目总结
    星光小组第二阶段团队绩效
    第二阶段冲刺第十天
    第二阶段冲刺第九天
    第二阶段冲刺第八天
  • 原文地址:https://www.cnblogs.com/2021-yanghaoran/p/10676580.html
Copyright © 2011-2022 走看看