這題A得很神奇...俺只是做了個猜測..寫了如下無比猥瑣丑陋的代碼..居然真給AC了...
我就是一位一位的確定..大致上是可行的..隨著精確位的深入..答案會越來越優...但我發現這樣非常不嚴謹很容易會出錯..那麼我就在確定一位時給其更長的嘗試范圍( 如當前要確定0.1上的數..按常規思維..嘗試0.0~0.9..而我的嘗試是從-5.1~5.1...)...
Program:
[cpp]
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#define oo 2000000000
#define ll long long
using namespace std;
int a,b,c,s;
double x,y,z,m,X,Y,Z,M;
void get(double k)
{
double tx,ty,tz;
int xx,yy;
tx=X; ty=Y; tz=Z;
for (xx=-51;xx<=51;xx++)
for (yy=-51;yy<=51;yy++)
{
x=X+xx*k;
y=Y+yy*k;
if (x<0 || y<0 || x+y>s) continue;
z=s-x-y;
m=0;
if (a!=0)
if (x>k) m+=a*log(x);
else continue;
if (b!=0)
if (y>k) m+=b*log(y);
else continue;
if (c!=0)
if (z>k) m+=c*log(z);
else continue;
if (m>M+0.00000001)
{
M=m;
tx=x;
ty=y;
tz=z;
}
}
X=tx; Y=ty; Z=tz;
}
int main()
{
int i;
double k;
scanf("%d%d%d%d",&s,&a,&b,&c);
M=-1e+100;
X=Y=Z=0;
for (x=0;x<=s+0.000001;x+=1)
for (y=0;y<=s-x+0.000001;y+=1)
{
z=abs(s-x-y);
m=0;
if (a!=0)
if (x>0.000001) m+=a*log(x);
else continue;
if (b!=0)
if (y>0.000001) m+=b*log(y);
else continue;
if (c!=0)
if (z>0.000001) m+=c*log(z);
else continue;
if (m>M+0.000001)
{
M=m;
X=x;
Y=y;
Z=z;
}
}
k=1;
for (i=1;i<=16;i++)
{
k/=10;
get(k);
}
printf("%.16lf %.16lf %.16lf\n",X,Y,Z);
return 0;
}