UPC Go Home(贪心 || 前缀和+二分)(STL二分函数的使用)

简介: UPC Go Home(贪心 || 前缀和+二分)(STL二分函数的使用)

Go Home

题目描述

There is a kangaroo at coordinate 0 on an infinite number line that runs from left to right, at time 0. During the period between time i−1 and time i, the kangaroo can either stay at his position, or perform a jump of length exactly i to the left or to the right. That is, if his coordinate at time i−1 is x, he can be at coordinate x−i, x or x+i at time i. The kangaroo’s nest is at coordinate X, and he wants to travel to coordinate X as fast as possible. Find the earliest possible time to reach coordinate X.


Constraints

X is an integer.

1≤X≤109


输入

The input is given from Standard Input in the following format:

X

输出

Print the earliest possible time for the kangaroo to reach coordinate X.

样例输入 Copy

6

样例输出 Copy

3

提示

The kangaroo can reach his nest at time 3 by jumping to the right three times, which is the earliest possible time.


题意: 从原点出发,在时间i可以走i的路程,可以向左向右或不动。问到达x的最短时间。

思路:

(1)贪心:一直往右走是时间最短的。会有两种情况:在i时恰好到达x,或在i时超过x;对于前者一定是最短时间,对于后者我们可以在时间i之前选择往左走,从而使i时恰好到达x;这也就引出了方法二

(2)前缀和+二分:基于(1)的分析我们可以维护一个前缀和数组。找数组中第一个>=x的位置即可。

代码:

(1)贪心(模拟)

#include<bits/stdc++.h>
using namespace std;
int x,start;
void solve(){
    cin>>x;
    for(int i=1;i<=x;i++){
        start+=i;
        if(start>=x){
            cout<<i<<endl;
            break;
        }
    }
}
int main(){
    solve();
    return 0;
}

(2)前缀和+二分(手写二分)

#include<bits/stdc++.h>
using namespace std;
const int maxn=50000;
int a[maxn],x;
void solve(){
    for(int i=1;i<maxn;i++) a[i]=a[i-1]+i;
    cin>>x;
    int l=0,r=maxn-1,res=0;
    while(l<=r){
        int mid=l+(r-l)/2;
        if(a[mid]>=x) r=mid-1;
        else if(a[mid]<x)l=mid+1;
    }
    cout<<l<<endl;
}
int cutele(){
    solve();
    return 0;
}

(3)STL 二分

#include<bits/stdc++.h>
using namespace std;
const int maxn=50000;
int a[maxn],x;
void solve(){
    for(int i=1;i<maxn;i++) a[i]=a[i-1]+i;
    cin>>x;
    int ans=lower_bound(a,a+maxn,x)-a;
    cout<<ans<<endl;
}
int cutele(){
    solve();
    return 0;
}

知识补充:

1.如果用mid=(left+right)/2,如果right是int上限一半还多,那么可能导致溢出,使用mid=left+(right-left)/2可以代替以避免溢出

2.lower_bound(first,last,val)函数在[first,last)进行二分查找返回大于或等于val的第一个元素的位置,如果是数组,返回该位置指针,若没有则返回last的位置。upper_bound()与lower_bound()相似,查找的是第一个大于val的元素的位置。举个栗子0v0:数组a={1,2,4,4,4,5,7,9,9,10,13,17},想查找4第一次出现位置,lower_bound(a,a+n,4)-a,返回值是2.


参考资料: 二分总结_

算法复习——二分(二分查找,stl lower_bound()、upper_bound()木棒切割,快速幂)


保持热爱,奔赴山海。

目录
相关文章
|
22天前
|
JSON JavaScript Go
Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
掌握 Go 语言的常见概念,如变量、循环、条件语句、函数、数据类型等等。深入了解 Go 基础知识的好起点是查阅 Go 官方文档
618 2
|
14天前
|
存储 算法 Go
go语言中的延迟执行函数
【5月更文挑战第13天】`defer`是Go语言中用于延迟执行函数的关键字,尤其适用于资源管理,如文件关闭和锁的释放。它在函数返回前按照LIFO顺序执行,确保资源在任何返回路径下都能正确释放。`defer`可以拦截`panic`并在函数返回前执行,但无法阻止某些致命的`panic`。此外,`defer`可用于修改返回值、输出调试信息和还原变量值。尽管在某些场景下可能影响性能,但Go的优化使得其在多数情况下性能表现良好,特别是在资源清理方面。在Go 1.20及以后的版本,`defer`的性能已显著提升,尤其是在高计算量的场景下。
243 2
|
7天前
|
编译器 Go
Go 语言函数
Go 语言函数
16 7
|
22天前
|
Go 数据处理
Go杂记1-切片Slice作为函数参数那点事儿
Go杂记1-切片Slice作为函数参数那点事儿
17 0
|
22天前
|
存储 Go 开发者
【Go语言专栏】函数在Go语言中的使用与实现
【4月更文挑战第30天】本文介绍了Go语言中函数的使用和实现,包括函数定义、参数传递、返回值、匿名函数、变长参数、函数类型、闭包和错误处理。通过示例展示了如何定义和调用函数,以及如何利用闭包和递归解决问题。此外,还提到了Go函数作为一等公民的特性,允许存储和传递。进一步学习可参考官方文档和相关书籍。
|
22天前
|
Go
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
【4月更文挑战第21天】Go语言函数是代码组织的基本单元,用于封装可重用逻辑。本文介绍了函数定义(包括基本形式、命名、参数列表和多返回值)、调用以及匿名函数与闭包。在函数定义时,注意参数命名和注释,避免参数顺序混淆。在调用时,要检查并处理多返回值中的错误。理解闭包原理,小心处理外部变量引用,以提升代码质量和可维护性。通过实践和示例,能更好地掌握Go语言函数。
32 1
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
|
22天前
|
程序员 Go API
【Go语言快速上手(二)】 分支与循环&函数讲解
【Go语言快速上手(二)】 分支与循环&函数讲解
|
22天前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
32 0
|
22天前
|
自然语言处理 数据挖掘 程序员
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(下)
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(上)
28 1
|
22天前
|
数据采集 搜索推荐 Go
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)(上)
《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)
30 1