zoukankan      html  css  js  c++  java
  • ACM 第十五天

    计算几何基础

    练习题

    C - Wasted Time

    Mr. Scrooge, a very busy man, decided to count the time he wastes on all sorts of useless stuff to evaluate the lost profit. He has already counted the time he wastes sleeping and eating. And now Mr. Scrooge wants to count the time he has wasted signing papers.

    Mr. Scrooge's signature can be represented as a polyline A1A2... An. Scrooge signs like that: first it places a pen at the point A1, then draws a segment from point A1 to point A2, then he draws a segment from point A2 to point A3 and so on to point An, where he stops signing and takes the pen off the paper. At that the resulting line can intersect with itself and partially repeat itself but Scrooge pays no attention to it and never changes his signing style. As Scrooge makes the signature, he never takes the pen off the paper and his writing speed is constant — 50 millimeters per second.

    Scrooge signed exactly k papers throughout his life and all those signatures look the same.

    Find the total time Scrooge wasted signing the papers.


    Input

    The first line contains two integers n and k (2 ≤ n ≤ 100, 1 ≤ k ≤ 1000). Each of the following n lines contains the coordinates of the polyline's endpoints. The i-th one contains coordinates of the point Ai — integers xi and yi, separated by a space.

    All points Ai are different. The absolute value of all coordinates does not exceed 20. The coordinates are measured in millimeters.

    Output

    Print one real number — the total time Scrooges wastes on signing the papers in seconds. The absolute or relative error should not exceed 10 - 6.

    Examples
    Input
    2 1
    0 0
    10 0
    Output
    0.200000000
    Input
    5 10
    3 1
    -5 6
    -2 -1
    3 2
    10 0
    Output
    6.032163204
    Input
    6 10
    5 0
    4 0
    6 0
    3 0
    7 0
    2 0
    Output
    3.000000000
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include<algorithm>
     5 #include<math.h>
     6 #include <bits/stdc++.h>
     7 using namespace std;
     8 typedef long double ld;
     9 typedef long long ll;
    10 
    11 ld ans=0;
    12 int main()
    13 {
    14     int n,k;
    15     ld x[1005],y[1005];
    16     scanf("%d%d",&n,&k);
    17 
    18     for(int i=0;i<n;i++)
    19     {
    20         cin>>x[i]>>y[i];
    21     }
    22     for(int i=0;i<n-1;i++)
    23     {
    24          ans+=sqrt((x[i+1]-x[i])*(x[i+1]-x[i])+(y[i+1]-y[i])*(y[i+1]-y[i]));
    25     }
    26     ans=ans*k/50;
    27     cout<<fixed<<setprecision(9)<<ans<<'
    ';
    28     return 0;
    29 }

    D - Trace

    One day, as Sherlock Holmes was tracking down one very important criminal, he found a wonderful painting on the wall. This wall could be represented as a plane. The painting had several concentric circles that divided the wall into several parts. Some parts were painted red and all the other were painted blue. Besides, any two neighboring parts were painted different colors, that is, the red and the blue color were alternating, i. e. followed one after the other. The outer area of the wall (the area that lied outside all circles) was painted blue. Help Sherlock Holmes determine the total area of red parts of the wall.

    Let us remind you that two circles are called concentric if their centers coincide. Several circles are called concentric if any two of them are concentric.


    Input

    The first line contains the single integer n (1 ≤ n ≤ 100). The second line contains n space-separated integers ri (1 ≤ ri ≤ 1000) — the circles' radii. It is guaranteed that all circles are different.

    Output

    Print the single real number — total area of the part of the wall that is painted red. The answer is accepted if absolute or relative error doesn't exceed 10 - 4.

    Examples
    Input
    1
    1
    Output
    3.1415926536
    Input
    3
    1 4 2
    Output
    40.8407044967
    Note

    In the first sample the picture is just one circle of radius 1. Inner part of the circle is painted red. The area of the red part equals π × 12 = π.

    In the second sample there are three circles of radii 1, 4 and 2. Outside part of the second circle is painted blue. Part between the second and the third circles is painted red. Part between the first and the third is painted blue. And, finally, the inner part of the first circle is painted red. Overall there are two red parts: the ring between the second and the third circles and the inner part of the first circle. Total area of the red parts is equal (π × 42 - π × 22) + π × 12 = π × 12 + π = 13π

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include<math.h>
     6 
     7 using namespace std;
     8 const int maxn = 105;
     9 const double pi=acos(-1.0);
    10 int a[maxn];
    11 int main()
    12 {
    13     int n;
    14     double ans=0;
    15     scanf("%d",&n);
    16     for(int i=1; i<=n; i++)
    17         scanf("%d",&a[i]);
    18     sort(a+1,a+n+1);
    19     int flag=1;
    20     for(int i=n; i>=1; i--)
    21     {
    22         ans+=(double)pi*a[i]*a[i]*flag;
    23         flag*=-1;
    24     }
    25     printf("%.10f
    ",ans);
    26     return 0;
    27 }

    H - A Problem about Polyline

    There is a polyline going through points (0, 0) – (x, x) – (2x, 0) – (3x, x) – (4x, 0) – ... - (2kx, 0) – (2kx + x, x) – ....

    We know that the polyline passes through the point (a, b). Find minimum positive value x such that it is true or determine that there is no such x.


    Input

    Only one line containing two positive integers a and b (1 ≤ a, b ≤ 109).

    Output

    Output the only line containing the answer. Your answer will be considered correct if its relative or absolute error doesn't exceed 10 - 9. If there is no such x then output  - 1 as the answer.

    Examples
    Input
    3 1
    Output
    1.000000000000
    Input
    1 3
    Output
    -1
    Input
    4 1
    Output
    1.250000000000
    Note

    You can see following graphs for sample 1 and sample 3.

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include<math.h>
     6 #include <bits/stdc++.h>
     7 using namespace std;
     8 typedef long double ld;
     9 typedef long long ll;
    10 //const int N=2e5+5;
    11 ld a,b;
    12 int main()
    13 {
    14     cin>>a>>b;
    15     //y=x-2pc
    16     //y=-x+2pc    c=(y+x)/2p
    17     if(a<b)
    18         puts("-1");
    19     else
    20     {
    21        ll l=1,r=1e9;
    22         ld res=1e15;
    23         while(l<=r)
    24         {
    25             ll mid=l+r>>1;
    26             ld c=(a+b)/(2.0*mid);
    27             if(c>=b)
    28                 l=mid+1,res=c;
    29             else
    30                 r=mid-1;
    31         }
    32         l=1,r=1e9;
    33         while(l<=r)
    34         {
    35             //y=x-2pc
    36             ll mid=l+r>>1;
    37             ld c=(a-b)/(2.0*mid);
    38             if(c>=b)
    39                 l=mid+1,res=min(res,c);
    40             else
    41                 r=mid-1;
    42         }
    43                  cout<<fixed<<setprecision(12)<<res<<'
    ';
    44     }
    45     return 0;
    46 }

    I - Triangle

    Johnny has a younger sister Anne, who is very clever and smart. As she came home from the kindergarten, she told his brother about the task that her kindergartener asked her to solve. The task was just to construct a triangle out of four sticks of different colours. Naturally, one of the sticks is extra. It is not allowed to break the sticks or use their partial length. Anne has perfectly solved this task, now she is asking Johnny to do the same.

    The boy answered that he would cope with it without any difficulty. However, after a while he found out that different tricky things can occur. It can happen that it is impossible to construct a triangle of a positive area, but it is possible to construct a degenerate triangle. It can be so, that it is impossible to construct a degenerate triangle even. As Johnny is very lazy, he does not want to consider such a big amount of cases, he asks you to help him.


    Input

    The first line of the input contains four space-separated positive integer numbers not exceeding 100 — lengthes of the sticks.

    Output

    Output TRIANGLE if it is possible to construct a non-degenerate triangle. Output SEGMENT if the first case cannot take place and it is possible to construct a degenerate triangle. Output IMPOSSIBLE if it is impossible to construct any triangle. Remember that you are to use three sticks. It is not allowed to break the sticks or use their partial length.

    Examples
    Input
    4 2 1 3
    Output
    TRIANGLE
    Input
    7 2 2 4
    Output
    SEGMENT
    Input
    3 5 9 1
    Output
    IMPOSSIBLE
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include<algorithm>
     5 #include<math.h>
     6 #include <bits/stdc++.h>
     7 using namespace std;
     8 typedef long double ld;
     9 typedef long long ll;
    10 
    11 bool tri(int a,int b,int c)
    12 {
    13     if(a+b>c && a+c>b && b+c>a)
    14         return true;
    15     return false;
    16 }
    17 
    18 int main()
    19 {
    20     int a,b,c,d;
    21     scanf("%d%d%d%d",&a,&b,&c,&d);
    22     if(tri(a,b,c)||tri(a,b,d) || tri(a,c,d) || tri(b,c,d))
    23     {
    24         printf("TRIANGLE
    ");
    25     }
    26     else if(a+b==c || a+b==d || a+c==d || a+c==b ||a+d==b || a+d==c ||b+c==d || b+d==c || b+c==a || b+d==a || c+d==a || c+d==b)
    27     {
    28         printf("SEGMENT
    ");
    29     }
    30     else
    31         printf("IMPOSSIBLE
    ");
    32     return 0;
    33 }

    K - Gerald's Hexagon

    Gerald got a very curious hexagon for his birthday. The boy found out that all the angles of the hexagon are equal to . Then he measured the length of its sides, and found that each of them is equal to an integer number of centimeters. There the properties of the hexagon ended and Gerald decided to draw on it.

    He painted a few lines, parallel to the sides of the hexagon. The lines split the hexagon into regular triangles with sides of 1 centimeter. Now Gerald wonders how many triangles he has got. But there were so many of them that Gerald lost the track of his counting. Help the boy count the triangles.


    Input

    The first and the single line of the input contains 6 space-separated integers a1, a2, a3, a4, a5 and a6 (1 ≤ ai ≤ 1000) — the lengths of the sides of the hexagons in centimeters in the clockwise order. It is guaranteed that the hexagon with the indicated properties and the exactly such sides exists.

    Output

    Print a single integer — the number of triangles with the sides of one 1 centimeter, into which the hexagon is split.

    Examples
    Input
    1 1 1 1 1 1
    Output
    6
    Input
    1 2 1 2 1 2
    Output
    13
    Note

    This is what Gerald's hexagon looks like in the first sample:

    And that's what it looks like in the second sample:

     1 #include<stdio.h>
     2 int s[1010];
     3 using namespace std;
     4 int main()
     5 {
     6     for(int i=1;i<=6;i++)
     7         scanf("%d",&s[i]);
     8     int a=(s[1]+s[2]+s[3]);
     9     printf("%d
    ",a*a-s[1]*s[1]-s[3]*s[3]-s[5]*s[5]);
    10   return 0;
    11 }

    M - Gleb And Pizza

    Gleb ordered pizza home. When the courier delivered the pizza, he was very upset, because several pieces of sausage lay on the crust, and he does not really like the crust.

    The pizza is a circle of radius r and center at the origin. Pizza consists of the main part — circle of radius r - d with center at the origin, and crust around the main part of the width d. Pieces of sausage are also circles. The radius of the i -th piece of the sausage is ri, and the center is given as a pair (xi, yi).

    Gleb asks you to help determine the number of pieces of sausage caught on the crust. A piece of sausage got on the crust, if it completely lies on the crust.


    Input

    First string contains two integer numbers r and d (0 ≤ d < r ≤ 500) — the radius of pizza and the width of crust.

    Next line contains one integer number n — the number of pieces of sausage (1 ≤ n ≤ 105).

    Each of next n lines contains three integer numbers xi, yi and ri ( - 500 ≤ xi, yi ≤ 500, 0 ≤ ri ≤ 500), where xi and yi are coordinates of the center of i-th peace of sausage, ri — radius of i-th peace of sausage.

    Output

    Output the number of pieces of sausage that lay on the crust.

    Examples
    Input
    8 4
    7
    7 8 1
    -7 3 2
    0 2 1
    0 -2 2
    -3 -3 1
    0 6 2
    5 3 1
    Output
    2
    Input
    10 8
    4
    0 0 9
    0 0 10
    1 0 1
    1 0 2
    Output
    0
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include<math.h>
     6 
     7 using namespace std;
     8 const int maxn = 100005;
     9 const double pi=acos(-1.0);
    10 
    11 int main()
    12 {
    13     int R,d;
    14     scanf("%d%d",&R,&d);
    15     int n;
    16     scanf("%d",&n);
    17     int ans=0;
    18     int x,y,r;
    19     while(n--)
    20     {
    21         scanf("%d%d%d",&x,&y,&r);
    22         double distance=sqrt(x*x+y*y);
    23         double xiao=distance-r;
    24         double da=distance+r;
    25         if(xiao>=R-d && da<=R)
    26         {
    27             ans++;
    28         }
    29 
    30     }
    31     printf("%d
    ",ans);
    32     return 0;
    33 }
    Note

    Below is a picture explaining the first example. Circles of green color denote pieces of sausage lying on the crust.

  • 相关阅读:
    呵呵,23号了,难道要通宵???
    开会效果不错
    开完会罗,明天离开这上有点奢华的地方:)
    感冒了,感觉糟透了。。。
    你好,深圳!你好,2010!
    上班 第一天
    。。轻。。。
    那天我生日
    英雄七十寿 无物下冷酒 横刀上闹市 直取数人头
    李孝利 唠叨
  • 原文地址:https://www.cnblogs.com/weixq351/p/9494365.html
Copyright © 2011-2022 走看看