zoukankan      html  css  js  c++  java
  • Sicily 1012. Stacking Cylinders 解题报告

    题目地址:Sicily 1012. Stacking Cylinders

    思路:

      最低层如果有n个圆,则一共会有n层,其中最高一层有1个。用n个数组记录n层圆的坐标,一开始输入底层的坐标,排序之后再不断利用下一层的坐标算出当前一层的坐标,知道最高层就行。对于每一个圆心坐标,可以用支撑它的下面两个圆心坐标通过几何计算方法算出。注意输出的格式。

    代码:

     1 #include<iostream>
     2 #include<iomanip>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 struct Point{
     8     double x,y;
     9 };
    10 
    11 void get_a_point_from_two_below(Point &p,const Point &p1,const Point &p2);
    12 bool cmp(const Point &p1,const Point &p2){
    13     return p1.x<p2.x;
    14 }
    15 
    16 int main(){
    17     int number_of_cylinders;
    18     while(cin>>number_of_cylinders&&number_of_cylinders!=0){
    19         Point *level[number_of_cylinders];
    20         for(int i=0;i<number_of_cylinders;i++) //create room for each level of cylinders.
    21             level[i]=new Point[number_of_cylinders-i];
    22         for(int i=0;i<number_of_cylinders;i++){ //get data of the bottom level
    23             cin>>level[0][i].x;
    24             level[0][i].y=1;
    25         }
    26         sort(level[0],level[0]+number_of_cylinders,cmp);
    27         for(int i=1;i<number_of_cylinders;i++){
    28             for(int j=0;j<number_of_cylinders-i;j++){
    29                 get_a_point_from_two_below(level[i][j],level[i-1][j],
    30                         level[i-1][j+1]);
    31             }
    32         }
    33         cout.setf(ios::fixed);
    34         cout<<setprecision(4)<<level[number_of_cylinders-1][0].x<<' '
    35                 <<level[number_of_cylinders-1][0].y<<endl;
    36         for(int i=0;i<number_of_cylinders;i++)
    37             delete level[i];
    38     }
    39     return 0;
    40 }
    41 void get_a_point_from_two_below(Point &p,const Point &p1,const Point &p2){
    42     double side=sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2));
    43     p.x=p1.x+2*cos(acos(side/4)+atan((p2.y-p1.y)/(p2.x-p1.x)));
    44     p.y=p1.y+2*sin(acos(side/4)+atan((p2.y-p1.y)/(p2.x-p1.x)));
    45 }
  • 相关阅读:
    7.服务器上用命令ffprobe看流质量
    filebeat记录
    Dubbo 一篇文章就够了:从入门到实战
    c/c++系列的运算符优先级总结
    动态单链表的传统存储方式和10种常见操作-C语言实现
    代码的规范化—高质量程序的结构(一)
    动态分配的顺序线性表的十五种操作—C语言实现
    IOS开发初步
    大数据方面一个博客
    Task not found in root project
  • 原文地址:https://www.cnblogs.com/jolin123/p/3423514.html
Copyright © 2011-2022 走看看