接触的东西越来越来反而变得不够灵活了,以前碰到的这样的题都要暴力,枚举,两个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;
}