程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> CodeForces Round #118 - Mushroom Scientists

CodeForces Round #118 - Mushroom Scientists

編輯:C++入門知識

   這題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; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved