星际穿越(网易)

题目描述

航天飞行器是一项复杂而又精密的仪器,飞行器的损耗主要集中在发射和降落的过程,科学家根据实验数据估计,如果在发射过程中,产生了 x 程度的损耗,那么在降落的过程中就会产生 x2 程度的损耗,如果飞船的总损耗超过了它的耐久度,飞行器就会爆炸坠毁。问一艘耐久度为 h 的飞行器,假设在飞行过程中不产生损耗,那么为了保证其可以安全的到达目的地,只考虑整数解,至多发射过程中可以承受多少程度的损耗?

输入描述:

每个输入包含一个测试用例。每个测试用例包含一行一个整数 h (1 <= h <= 10^18)。

输出描述:

输出一行一个整数表示结果。
示例1

输入

10

输出

2

这个题,题意是比较简单的,就是输入一个h,然后自己找到一个x+x*x<=h中x的最大值。x(x+1)<=h。

这里要注意,输入是个long型的,所以使用nextLong()读取。

1、可以直接用求根公式x*x+x-h=0.求出来的根是整数,则就是,不是整数,直接转成整数即可,也就是最大的那个了。

2、先求出k=sqrt(h)。如果k(k+1)<=h,那么就是k,否则就是k-1,因为(k-1)*k<h肯定成立。

3、遍历查找,符合x=i时,x(x+1)<=h,x=i+1时,x(x+1)>h,则i就是该值。此时如果从0开始遍历,会超时,应该从sqrt(h)往前遍历。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            long h=sc.nextLong();
          /*  for(long i=(int)Math.sqrt(h);i>=0;i--){
                if((i+i*i)<=h&&(i+1+(i+1)*(i+1))>h){
                    System.out.println(i);
                    break;
                }
                    
                
            }
            */
            //k是h的开根号,所以k(k-1)肯定是小于h的,如果k(k+1)<=h,那么这个k就是所求的解
            long k=(int)Math.sqrt(h);
            if(k*(k+1)<=h) {
                System.out.println(k);
            }else
                System.out.println(k-1);
        }
    }
}
原文地址:https://www.cnblogs.com/xiaolovewei/p/8313152.html