随笔 - 87  文章 - 279  trackbacks - 0
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

潜心看书研究!

常用链接

留言簿(19)

随笔分类(81)

文章分类(89)

相册

ACM OJ

My friends

搜索

  •  

积分与排名

  • 积分 - 214376
  • 排名 - 116

最新评论

阅读排行榜

评论排行榜

Sailboat

Problem H: Sailboat

In the sailboat race, the contestant is requested to along with the prearrange path. Sailing ship's power comes from wind power and contestant's manpower. The wind power can completely used.

In a competition, the contestants are requested to along with a 1/4 circles with radius R, the sailboat will goto east from south. During this process, the wind direction is straight from west to the east with constant speed and power.

In order to maintain the travel direction, the athlete must adjust the sail to the vertical angle from movement direction in any time.

If the speed of sailboat is proportional to the power at movement direction, the proportional factor is k. Supposes the wind power is f, the athlete manpower is h, please given the time of sailboat from the beginning to the end.

Input

The first line of each case consists of 4 double number, that is radius of path: R, wind power: f,athlete manpower: h and proportional factor:k. In order to avoid the floating point error, you needn't output the answer directly. The next line is a integer n, the following n lines gives a double value which is candidate answer.

Output

For each candidate of each case, Only "Yes" or "No" should be printed. Output "Yes" if the relative error to your answer is less than 3%, otherwise "No". For example, if the model answer is 100, and the candidate is 98 or 102, you should output "Yes". Output one blank line between neighboring case

Sample Input

1.0 2.0 1.0 1.0
2
0.35
0.76

Sample Output

No
Yes

Problem Source: provided by skywind

#include <iostream>
#include 
<cmath>
using namespace std;

const int MAXN = 100;
const double PI = acos(-1.0);

double R, F, H, K, ans;
int n, cas;

double func(double x) {
    
return R / K / (H + F * cos(x));
}


double romberg(double a, double b, double EPS = 1e-6{
    
double t[MAXN][MAXN] = {0}, tmp;
    
int i, j, k, k2, m, m4;
    t[
0][0= (func(a) + func(b)) * (b - a) / 2;
    k 
= 1; k2 = 1;
    
while (1{
        tmp  
= 0;
        
for (i = 1; i <= k2; i++{
            tmp 
+= func(a + (2 * i - 1* (b - a) / (2 * k2));
        }

        t[
0][k] = (t[0][k - 1+ tmp * (b - a) / k2) / 2;
        
for (m = 1, m4=4; m <= k; m++, m4 *= 4{
            t[m][k 
- m] = (m4 * t[m - 1][k - m + 1- t[m - 1][k - m]) / (m4 - 1);
        }

        
if (fabs(t[k][0- t[k - 1][0]) < EPS) break;
        k
++; k2 *= 2;
    }

    
return t[k][0];
}


void solve() {
    
double tmp;
    scanf(
"%lf"&tmp);
    
if (fabs(tmp - ans) / ans < 0.03) printf("Yes\n");
    
else printf("No\n");
}


int main() {
    freopen(
"2457.in""r", stdin);
    
while (scanf("%lf%lf%lf%lf%d"&R, &F, &H, &K, &n) != EOF) {
        
if (cas) printf("\n");
        
else cas++;
        ans 
= romberg(0, PI/2);
        
while (n--{
            solve();
        }

    }

    
return 0;
}
posted on 2007-10-20 01:02 阅读(678) 评论(0)  编辑 收藏 引用 所属分类: 算法&ACM

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理