圆周上两点间的距离

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 30720KB;其他语言 555008KB
题目描述:
定义圆周上两点的距离s为这两点之间的劣弧对应的圆心角度数(0<=s<=180),现输入圆周上的n个点(n>=2),以角度a表示其位置(0<=a<360),输入按a从小到大排序。求最远的一对点之间的距离。
输入
第一行为点个数n,后跟n行,每行一个双精度浮点数,表示点的角度(小数点后保留8位),例如输入样例中为4个点的输入:
输出
输出最远的一对点之间的距离(双精度浮点数,小数点后保留8位)和'\n'换行符。例如输入样例中,10.00000000与183.00000000两个点之间的距离为173.00000000,大于10.00000000与198.0000000之间的距离172.00000000,所以应输出:
173.00000000

样例输入
4
10.00000000
180.00000000
183.00000000
198.00000000
样例输出
173.00000000

Hint
注意事项:
1.程序性能要足够快,否则可能无法通过一些大型测试数据;
2.如果使用java语言,可以考虑使用BufferedReader从标准输入读取输入数据,Scanner读取一些比较大的输入数据会发生超时。

思路:题目意思很简单,给你圆上一些点,求圆上两个点的最大距离。注意:由于是劣弧,所以所得到的圆心角度数<=180。如果所求的距离x大于180就等于(360-x)。

暴力求解:很简单就是两个for循环遍历,依次求两个点中的最大距离。但是这个代码只能通过50%。本来以为是Scanner的原因,换位BufferedReader后结果还是50%这个情况。猜想:可能是两个for循环嵌套复杂度变大了,要对代码进行局部优化,使其变为一个for循环或者一个while。

import java.util.Scanner;public class Test {public static void main(String[] args){Scanner sr = new Scanner(System.in);int n=sr.nextInt();Double f[]=new Double[n];for(int i=0;i<n;i++){f[i]=sr.nextDouble();}Double max=Double.MIN_VALUE;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){//dif即为两个点的圆形角差距Double dif=Math.abs(f[i]-f[j]);//大于180那么就取360-difif(dif>180){dif=360-dif;}if(dif>max){max=dif;}}}//max即为最大距离,用String的format方法转成小数点后保留8位输出。System.out.println(String.format("%.8f",max));}
}

优化后代码:整体思想就是以圆上两个点组成的半圆慢慢移动,始终让差值接近180。

  1. 让big指针先移动,直到big所指向的值与samll所指向的值大于180。(同时将期间的最大值赋给max),然后samll开始移动。
  2. samll开始移动,同时判断它和samll所指向的值差值是否小于180,一旦小于180则big又开始移动。
  3. 如此反复,直到big>=n。最后输出max的值。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Test {public static void main(String args[]) throws IOException {InputStreamReader in = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(in);int n = Integer.valueOf(br.readLine());double[] f = new double[n];for (int i = 0; i < n; i++) {f[i] = Double.valueOf(br.readLine());}double max = 0.0;    //圆上两点最后输出的最大距离int samll = 0;      //开始指针int big = 1;     //跟进指针while(big < n){//定义两点距离diffdouble diff = f[big] - f[samll];//如果diff超过180if(Double.compare(diff , 180.0) > 0){double dif = Math.abs(f[big] - f[samll]);//dif大于180就取(360-dif),反之则取difdouble dist=360.0 - dif; //如果测试的两个点的距离大于max则将dist赋给max。同时small往后移动if(dist > max)max = dist;samll++;}else{//diff大于max则big往后移,(刚开始是一直往后移,直到大于180为止)if(diff > max)max = diff;big++;}}System.out.printf("%.8f\n" , max);}
}

搜狗2018校园招聘编程题学习相关推荐

  1. 51信用卡2018校园招聘编程题学习

    1.数据中包含u51的个数 题目描述: 有一个长度是200000的队列,队列中的元素均为字符串,现需要创建3个线程分别取出队列中的元素,并查找元素中是否含有字符串u51,如果含有该字符串,则计数器加1 ...

  2. 网易2018校园招聘编程题真题集合

    1/8 [编程题]魔法币 #include<bits/stdc++.h> using namespace std; #define clr(a) memset(a, 0, sizeof(a ...

  3. 网易2018校园招聘编程题

    [编程题] 魔法币 时间限制:1秒 空间限制:32768K 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0) ...

  4. 网易2018校园招聘编程题真题集合 详解

    ##编程题 ###一.魔法币 ####描述: 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入 xxx(xxx 可以为 00 ...

  5. [2018]试卷: 网易2018校园招聘编程题真题集合

    [编程题] 魔法币 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1: ...

  6. [网易]2018校园招聘编程题真题集合

    题目:  小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币.  魔法机器1:如果投入 ...

  7. 网易2018校园招聘编程题真题集合2相反数

    这道题是说给出一个数,求他的"相反数",相反数是先把原先的数倒过来,然后把他和倒过来之前的相加. #include <iostream> #include <st ...

  8. 网易2018校园招聘编程题真题集合1魔法币

    一开始没有理解题意:这道题是说,每次把手头上的魔法币全都投入. 这道题一开始用了回溯,只通过80%,大数据通不过. #include <iostream> #include <str ...

  9. 网易2018校园招聘编程题真题集合3字符串碎片

    这道题不难,需要存下碎片的个数,就遍历字符串,保存刚刚遍历过的字符,如果这个字符和刚刚的字符不同,说明到了一个新的碎片,碎片个数+1. 最后存储保留两位的double,用一个char数组来存,spri ...

最新文章

  1. html的进一步了解(更新中···)
  2. 访问远程mysql数据库
  3. python tkinter listbox_Python3 tkinter基础 Listbox for+insert 将list中元素导入listbox中
  4. 计算机科学与技术毕业答辩流程,计算机科学与技术学院毕业答辩工作细则
  5. python装饰器使用多吗_如何理解Python装饰器?
  6. Spark SQL实战
  7. 策略模式与简单工厂模式
  8. wifi小程序源码流量主源码
  9. 【原创】 ES5高效封装WIN10系统教程2020系列(六)ES5封装
  10. 装什么软件测试笔记本耐用,我买了新电脑,用什么软件测试比较好?
  11. Android webview调用本地文件选择失败解决
  12. delphi10.2 将网页页面带格式复制到word中。
  13. 数据分析在网络营销中的意义有哪些
  14. 《三重门》作者的机灵与人物的笨拙
  15. 2017年,阿里巴巴开源的那些事
  16. 离散数学学习笔记——第七讲——特殊关系和函数(5.4 哈斯图和特殊元素)
  17. 微信公众号封面一键生成器-续
  18. dvm_lock_sample 解析
  19. 计算机毕业设计ssm社区爱心活动网站be83l系统+程序+源码+lw+远程部署
  20. Python网络爬虫(七):百度文库文章爬取器

热门文章

  1. azkaban安装Solo Server
  2. 破解卡米 刷机包(ROM)的解包与打包过程
  3. CSS常见布局的几种实现方式(面试常考)
  4. 【Linux】修改Xshell 7默认配色方案和会话属性
  5. wpa_cli 操作指令使用指南
  6. 试卷分析的四个度:难度、区分度、信度、效度
  7. 自控并不是你想的那样
  8. AS-项目文件的规范化管理
  9. 投了几百份简历都没人回?兄弟,你的简历真的有问题啊!
  10. 概率特性仿真实验与程序-Matlab仿真-随机数生成-负指数分布-k阶爱尔兰分布-超指数分布