首页 > 代码库 > BZOJ 2048 题解

BZOJ 2048 题解

2048: [2009国家集训队]书堆

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 1076  Solved: 499
[Submit][Status][Discuss]

Description

技术分享

Input

第一行正整数 N M

Output

一行(有换行符),L,表示水平延伸最远的整数距离 (不大于答案的最大整数)

Sample Input

样例
#1
Input: 1 100
Output: 49

#2
Input: 2 100
Output: 74

Sample Output

N <= 10^18
数据保证答案 < 10^6
 
————————————————————————————
 
 物理题:
从最上一本书考虑,当重心落在下一本书的边缘,由于力矩平衡,恰好不落下。
技术分享
两本书整体根据力矩平衡,重心左移m/4距离。
技术分享
两本书整体根据力矩平衡,重心左移m/6距离。
技术分享
 
两本书整体质心根据力矩平衡,重心左移m/8距离。
于是现在题目求( m/2 + m/4 + m/6 + m/8 + ... + m/m ) ,不难发现,这道题与调和级数有关。
 技术分享
技术分享
 
 根据上述公式,代码如下:
技术分享
/**************************************************************    Problem: 2048    User: shadowland    Language: C++    Result: Accepted    Time:0 ms    Memory:1300 kb****************************************************************/ #include "bits/stdc++.h" using namespace std ;typedef long long QAQ ;typedef double db ;const db Euler_const = 0.5772156649015328606065120900824024310421593359 ; const db eps = 1e-10 ; int main ( ) {        db tmp = 0.0000 , N , M ;        cin >> N >> M ;         if ( N <= 1e4 ) for ( int i=1 ; i<=N ; ++i ) tmp += ( 1.000 / ( db ) i ) ;        else tmp = log ( N + 1.000 ) + Euler_const ;         tmp *= ( M * 0.500 ) ;        cout << ( QAQ ) ceil ( tmp - 1 ) << endl ;        return 0 ;  } 
View Code

 

2016-10-29 00:56:53

 
 
 
 
 
 
 
 
 
 
 
 

BZOJ 2048 题解