当前位置 : 主页 > 编程语言 > c语言 >

ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest Problem G.

来源:互联网 收集:自由互联 发布时间:2023-09-06
Problem G. Glorious Stadium Input file: glorious.in Output file: standard output Balloon Color: Orange A lot of people want to attend the World Cup, so we would like to construct a glorious stadium using the following algorithm: 1. Construc


Problem G. Glorious Stadium
Input file: glorious.in
Output file: standard output
Balloon Color: Orange
A lot of people want to attend the World Cup, so we would like to construct a glorious stadium using the
following algorithm:
1. Construct 1st layer of the stadium by building a fence shaped like a regular polygon P1 with K
sides and its in-circle C1 (with radius R) is the field of the stadium.
2. Construct 2nd layer of the stadium by building a fence shaped like a regular polygon P2 with K
sides and its in-circle C2, such that C2 is the circumcircle of P1, so it surrounds the layer 1.
3. Construct 3rd layer of the stadium by building a fence shaped like a regular polygon P3 with K
sides and its in-circle C3, such that C3 is the circumcircle of P2, so it surrounds the layer 2.
Until · · ·
N. Construct n−th layer of the stadium by building a fence shaped like a regular polygon PN with K
sides and its in-circle CN , such that CN is the circumcircle of PN−1, so it surrounds the layer N −1.
For each layer of the stadium, the area of the polygon that is not included in its in-circle tells us the
amount of the people who can stay to cheer for the teams (because this is the only place they can sit).
We would like to calculate the sum of cheerers areas of all the N layers of the glorious stadium, that is:

N
i=1
Area(Pi \ Ci)
Page 9 of 16
ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest
Arab Academy for Science, Technology and Maritime Transport, 2017
Input
The first line of the input consists of a single integer 1 ≤ T ≤ 105
the number of test cases. Each test
case consists of one line containing 3 space separated integers N, R, K. N is the number of layers of
the stadium, R is the radius of the stadium C1 and K is the number of sides of the polygons; where
1 ≤ N ≤ 105
, 1 ≤ R ≤ 100, 3 ≤ K ≤ 2 · 104 and 5 · K ≥ N.
Output
For each test case output a single line displaying the case number and the area of the cheerers rounded
to exactly 5 decimal places. The output will be checked with a relative error.
Example
glorious.in standard output
3
3 10 3
2 10 4
5 100 6
Case 1: 4314.57552
Case 2: 257.52220
Case 3: 31096.23444
Note
• in-circle is the largest circle the will fit inside a polygon that touches every side.
• circumcircle is the circle that passes through each vertex of the regular polygon.
• The given figure is a demonstration of the first test case, where the radius of the smallest circle is
the given R, and the answer is the area of the grey parts.
• The formula P \ C denotes the area covered in P and not covered in C, as shown in the figure.

简单的计算几何题目;
推公式即可解决;

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef unsigned long long int ull;
#define maxn 100005
#define ms(x) memset(x,0,sizeof(x))
#define Inf 0x7fffffff
#define inf 0x3f3f3f3f
const int mod = 1e9 + 7;
#define pi acos(-1.0)
#define pii pair<int,int>
#define eps 1e-5
#define pll pair<ll,ll>
#define lson 2*x
#define rson 2*x+1

long long  qupower(int a, int b) {
    long long  ans = 1;
    while (b) {
        if (b & 1)ans = ans * a;
        b >>= 1;
        a = a * a;
    }
    return ans;
}

inline int read() {
    int an = 0, x = 1; char c = getchar();
    while (c > '9' || c < '0') {
        if (c == '-') {
            x = -1; 
        }
        c = getchar();
    }
    while (c >= '0'&&c <= '9') {
        an = an * 10 + c - '0'; c = getchar();
    }
    return an * x;
}


double  n,r,k;

double sum;




int main() {
//  ios::sync_with_stdio(false);
    freopen("glorious.in","r",stdin);
     int t;
    cin>>t;
    int cnt=0;
    while(t--){
        cnt++;
        cin>>n>>r>>k;
        sum=0.0;
        double R;   
        while(n--){
            double ans=0.0;
            R=1.0*r/(sin(pi*(k-2)/k/2));
            double a=2.0*sqrt(R*R-r*r);
            sum+=1.0*k/2*r*a-pi*r*r;
        //  cout<<sum<<endl;
            r=R*1.0;
        }
        cout<<"Case "<<cnt<<": ";
        printf("%.10f\n",1.0*sum);
    }
}


网友评论