1. 程式人生 > >題目:B. High School: Become Human

題目:B. High School: Become Human

contest double 大小 想法 its pan HR www. CI

題目:B. High School: Become Human 題目鏈接:http://codeforces.com/contest/987/problem/B Key words:math;對數;單調性;double精度問題;long double;CF_DIV2_B; 分析: 這個題第一個想法是直接算出x^y和y^x的值,然後比較輸出結果。但是,題目中x和y的取值範圍在1~1e9,所以,這就意味著算法應該不是直接算結果。那麽,應該有其它做法。其實這裏是可以找規律(比賽中也有許多人是找規律AC的),而現在要說的是用自然對數把復雜度降低下來。 首先,x^y和y^x都可以在ln的基礎上建立自然對數,也就是得到 ln(x^y) = y*ln(x), ln(y^x) = x*ln(y)。現在由題目可以得到x和y都是大於等於1,所以它們冪組合的對數一定是大於0,這樣,單調性就有了保證,就可以直接把上界為(1e9)^(1e9)這樣的運算變成上界為21*(1e9)的運算。因為log()函數是double函數,所以,x和y的數據類型都為double型。但是,這裏卡了精度,用double型可能本地能過的例子無法過服務器,所以,一律使用long double型保證精度。然後接下來的就是普通的比較大小了。 參考資料:
  1. 做法:https://www.zybang.com/question/6b561fb3e136a90b186a34fd18fc4aa9.html
  2. C語言log()函數:http://c.biancheng.net/cpp/html/187.html
  3. 各種數據類型大小範圍:https://blog.csdn.net/xuexiacm/article/details/8122267
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main() {
 5     long double a,b; cin>>a>>b;
 6     long double x = b * log(a), y = a * log(b);
 7     if(x < y) cout<<"
<"<<endl; 8 else if(x == y) cout<<"="<<endl; 9 else cout<<">"<<endl; 10 return 0; 11 }

題目:B. High School: Become Human