• ACM_折线中点


    折线中点

    Time Limit: 2000/1000ms (Java/Others)

    Problem Description:

    给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线。 
    请你求出这条折线的中点坐标。
    

    Input:

    第一行包含一个整数N。 (2 <= N <= 100) 
    下面N行每行包含两个整数Xi, Yi代表Pi的坐标。(0 <= Xi, Yi <= 10000)

    Output:

    输出折线段的中点坐标。坐标保留一位小数。
    (中点坐标:在此折线上取一个点,使折线左右两边的长度相等)

    Sample Input:

    3  
    0 0   
    30 30  
    40 20
    

    Sample Output:

    20.0 20.0
    解题思路:纯数学题,思路比较简单。数组c保存的是当前点到前一个点的距离,通过累计,当求和完折线总长度时,应该找折线总长一半所在的线段。设p(x,y)是折线的中点,A(a1,b1)是p的前一个点,B(a2,b2)是p的后一个点,线段AP:线段AB=t,则求中点p坐标应为:x=a1+t*(a2-a1);y=b1+t*(b2-b1)。
    AC代码:
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int N;
     6     int k,a[105],b[105];
     7     double sum,p1,p2,tmp,c[105],p;
     8     while(cin>>N){
     9         memset(c,0,sizeof(c));
    10         cin>>a[0]>>b[0];
    11         k=c[0]=sum=0;
    12         for(int i=1;i<N;++i){
    13             cin>>a[i]>>b[i];
    14             sum+=sqrt((a[i]-a[i-1])*(a[i]-a[i-1])+(b[i]-b[i-1])*(b[i]-b[i-1]));
    15             c[i]=sum;
    16         }
    17         tmp=sum/2.0;
    18         for(int i=0;i<N;i++){
    19             if(c[i]>=tmp){
    20                 k=i;
    21                 break;
    22             }
    23         }
    24         //k=lower_bound(c,c+N,tmp)-c;
    25         tmp-=c[k-1];
    26         p=tmp/(c[k]-c[k-1]);
    27         p1=a[k-1]+(a[k]-a[k-1])*p;
    28         p2=b[k-1]+(b[k]-b[k-1])*p;
    29         printf("%.1f %.1f
    ",p1,p2);
    30     }
    31     return 0;
    32 }
     
  • 相关阅读:
    FusionCharts ScrollColumn2D图
    Java Web项目部署Tomcat运行出错
    Eclipse部署Java Web项目到Tomcat出错
    JavaScript过滤特殊字符
    pl/sql 在一个程序块里打印日志输出到表格
    Java中过滤出字母、数字和中文的正则表达式
    pl/sql 程序块里打印问题
    C++函数的Boost内存池性能介绍
    boost内存池的使用介绍
    内存管理 Boost::singleton_pool
  • 原文地址:https://www.cnblogs.com/acgoto/p/8836984.html
Copyright © 2020-2023  润新知