zoukankan      html  css  js  c++  java
  • Codeforces 1479A. Searching Local Minimum(注意输入+二分)

    题意

    1. 有n个数字,数字范围为1~n且不重复。
    2. 有数字流传输过来,你预先不知道其位置,但是你可以在接收数字之前给其定下位置。
    3. 问:你能否在确定小于等于100个数字位置之前找到一个数字,这个数字 a[i] 满足 a[i]<min(a[i-1],a[i+1])。(a[0]=a[n+1]= ∞)

    解题思路

    1. 数据范围n为10^5,通过线性输入肯定无法解题,因为前100个数字不一定有满足题意的数字。
    2. 所以想到了二分法,10^5 采用二分法,只用二分 16 次。
    3. 要想找到满足题意的数字,需要运用极值存在的充分条件——区间左端递减右端递增,则区间内一定存在极小值点。(虽然题目中的点是离散的,但是可以类比)。如图中(2)
    4. 不断二分,让区间 [l,r] 总是满足 a[l-1]>a[l] 且 a[r]<a[r+1] 。

    注意

    1. 这题最难的地方在于不是常规的输入输出,你并不能一次性输入所有n个数字,然后判断得出结果。(通过强行让你flush实现)

    C++ Code

    #include <iostream>
    using namespace std;
    int a[100010];
    
    int main() {
    	int n;
    	cin >> n;
    	int l = 1;
    	int r = n;
    	while(l < r){
    		int m = (l+r)/2;
    		cout << "? " << m << endl << flush;
    		cout << "? " << m+1 << endl << flush;
    		cin >> a[m] >> a[m+1];
    		if(a[m] < a[m+1]){
    			r = m;
    		}else{
    			l = m+1;
    		}
    	}
    	// 此时l与r相等,输出l或r都可。 
    	cout << "! " << l << endl;
    	return 0;
    }
    
  • 相关阅读:
    [我的阿里云服务器] —— FTP配置
    [我的阿里云服务器] —— WorkPress
    现阶段状态,三年的门槛!!!
    dubbo初体验
    SpringBoot简易搭建
    javascript数组特性
    linux修改root账户的用户名所得的教训
    记一次虚拟机无法访问主机的坑
    javascript真假(true/false)值
    Java集合基本概念及元素添加
  • 原文地址:https://www.cnblogs.com/zhangjiuding/p/14388948.html
Copyright © 2011-2022 走看看