您的位置:首页 > 其它

URAL 1200. Horns and Hoofs 枚举+数学

2013-08-05 13:38 309 查看
接触的东西越来越来反而变得不够灵活了,以前碰到的这样的题都要暴力,枚举,两个for循环试试的,今天看到时脑子里接着想暴力会超时的,但是好几个人都200+ms过了,我一直在推导,证明,最后越推越麻烦,一个题也没做出来,其实这个题很简单的,O(A的范围的算法),一个for循环,枚举A的个数,然后根据profit=A*a+B*b-a*a-b*b,是y的二次函数,根据图像b=B/2时最大,然后以此为轴,两边递减。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
    //freopen("in.txt","r",stdin);
    double A,B,maxx;
    int k,a,b;
    scanf("%lf%lf%d",&A,&B,&k);
    maxx=-100000;
    a=0;
    b=0;
    for(int i=0; i<=k; i++)
    {
        int y=B/2;
        double temp;
        if(y+i>k)
            y=k-i;
        if(y<0)  y=0;
        temp=A*i+B*y-i*i-y*y;
        if(temp>maxx)
        {
            maxx=temp;
            a=i;
            b=y;
        }
    }
    printf("%.2lf\n%d %d\n",maxx,a,b);
    return 0;
}


纯暴力枚举的算法。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
    //freopen("in.txt","r",stdin);
    double A,B,maxx;
    int a=0,b=0,k;
    maxx=-100000;
    scanf("%lf%lf%d",&A,&B,&k);
    for(int i=0;i<=k;i++)
    {
        for(int j=0;j+i<=k;j++)
        {
            double temp=A*i+B*j-i*i-j*j;
            if(temp>maxx)
            {
                maxx=temp;
                a=i;
                b=j;
            }
        }
    }
    printf("%.2lf\n%d %d\n",maxx,a,b);
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: