Codeforces77E Martian Food

http://codeforces.com/problemset/problem/77/E

如图,给出黑圆的半径 R 和黄圆的半径 r,再给出一个整数 k,表示画 k 个绿色的圆,问最小一个圆的半径。

上面的第一幅图是 R = 4, r = 3, k = 1 的状况。

第二幅图是 R = 4, r = 2, k = 2 的状况。

每个测试点有不超过 10000 组数据。每组数据的 k 不超过 10000。

以黄圆和黑圆的切点为原点,切线方向为 y 轴,对图形进行几何反演,黄圆和黑圆变成两条平行直线,粉色和绿色的圆在平行线之间,就容易求得第 k 个圆的圆心和半径,然后再反演一次,得到答案。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4
 5 #include <algorithm>
 6 #include <iostream>
 7
 8 const double T = 100;
 9
10 double sqr(double x) { return x * x; }
11
12 struct Point
13 {
14   double x, y;
15
16   Point(double xi, double yi): x(xi), y(yi) {}
17
18   Point(Point p, double r)
19   {
20     double d = p.dis();
21     x = p.x / d * r;
22     y = p.y / d * r;
23   }
24
25   double dis() const { return sqrt(x * x + y * y); }
26 };
27
28 struct Circle
29 {
30   Point mid;
31   double r;
32
33   Circle(Point midi, double ri): mid(midi), r(ri) {}
34 };
35
36
37 double inversion(const Circle& c)
38 {
39   double h = c.mid.dis();
40   double r = c.r;
41   return r * T / (sqr(h) - sqr(r));
42 }
43
44 double inversion(Point p, double r) { return inversion(Circle(p, r)); }
45
46 int main()
47 {
48   int casc;
49   scanf("%d", &casc);
50   for (int casi = 1; casi <= casc; casi++) {
51     double r, R;
52     int k;
53     scanf("%lf %lf", &R, &r);
54     scanf("%d", &k);
55     Point p1(T / 2 / r, 0);
56     Point p2(T / 2 / R, 0);
57     double x = (R - r) * T / 4 / r / R;
58     printf("%.10f\n", inversion(Point(T * (R + r) / 4 / R / r, 2 * k * x), x));
59   }
60   return 0;
61 }

时间: 2024-08-04 04:32:40

Codeforces77E Martian Food的相关文章

[ACM] ZOJ Martian Addition (20进制的两个大数相加)

Martian Addition Time Limit: 2 Seconds      Memory Limit: 65536 KB   In the 22nd Century, scientists have discovered intelligent residents live on the Mars. Martians are very fond of mathematics. Every year, they would hold an Arithmetic Contest on M

1941. Scary Martian Word

1941. Scary Martian Word 这道题 一个长度为3的字符串视为 一个 火星文 字母(ASCII 33-122) ,给出一个火星人认为恐怖的单词(由火星字母组成) 然后 给你一篇文章问你火星人认为恐怖的单词个数(可以乱序) 嗯,一开始题意理解错了...然后就错了 彬神说……是双端队列 然后写了,感觉自己真是对对对的…… 嗯,过度自信,起始忽略了一个条件. 做法,因为是三个单词 122+122*10+122*100 也就差不多了 然后哈希.数组标记, 懒得写了…… 贴代码…… #

xtu summer individual-4 D - Martian Strings

Martian Strings Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 149E64-bit integer IO format: %I64d      Java class name: (Any) During the study of the Martians Petya clearly understood that the Marti

poj 2948 Martian Mining (dp)

题目链接 完全自己想的,做了3个小时,刚开始一点思路没有,硬想了这么长时间,想了一个思路, 又修改了一下,提交本来没抱多大希望 居然1A了,感觉好激动..很高兴dp又有所长进. 题意: 一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个 格子内的数量是多少.最北边有bloggium的收集站,最西边有 yeyenum 的收集站. 现在要在这些格子上面安装向北或者向西的传送带(每个格子自能装一种).问最多能采到多少矿. 传送带只能直着走,不可弯曲,不能交

POJ 2948 Martian Mining

题目大意: NASA在火星发现了一个矿场矩阵.矩阵中的每个单元格都有两种矿Yeyenum和Bloggium.我们知道每个单元格中这两种矿的数量.NASA决定在北边建造Bloggium的矿石精炼厂,在西边建造Yeyenum的矿石精炼厂.于是需要我们把bloggium矿石向北运(行号等于0的方向),把Yeyenum矿石向西运(列号等于0的方向).但由于矿石的不稳定在建造传送带时有特殊要求.求建造传送带后两种矿石最多能收集多少. 解题思路: dp[i][j]代表着从(0,0)到(i,j)这两点间组成的

UVA 1366 九 Martian Mining

Martian Mining Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 1366 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 int dp[505][505][3]; 7

POJ 2948 Martian Mining(DP)

题目链接 题意 : n×m的矩阵,每个格子中有两种矿石,第一种矿石的的收集站在最北,第二种矿石的收集站在最西,需要在格子上安装南向北的或东向西的传送带,但是每个格子中只能装一种传送带,求最多能采多少矿. 思路 :记忆化搜索.也可以用递推. //2948 #include <stdio.h> #include <string.h> #include <iostream> using namespace std ; int yeye[510][510] ,blog[510]

What is martian source / martian packets

Martian source / Martian packets In Linux, by default, packets are considered individually for routing purposes. Thus, all the routing algorithm determines where to send a packet based on that packet itself, without taking into consideration that the

递推DP UVA 1366 Martian Mining

题目传送门 1 /* 2 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 3 到达边界后把沿途路上的权值相加求和使最大 4 DP:这是道递推题,首先我题目看了老半天,看懂后写出前缀和又不知道该如何定义状态好,写不出状态转移方程,太弱了. 5 dp[i][j]表示以(i, j)为右下角时求得的最大值,状态转移方程:dp[i][j] = max (dp[i-1][j] + sum1[i][j], dp[i][j-1] + sum2[i][j])