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;
    }
    
  • 相关阅读:
    SpringBoot中添加事务
    隐藏样式
    Mybatis配置解析
    题目1064:反序数------玩转小聪明
    题目1063:整数和
    题目1062:分段函数23333333333333
    题目1060:完数VS盈数------这题做得我想骂人
    题目1059:abc----------就喜欢这样的题
    题目1050:完数-----------runtime error的问题
    题目1049:字符串去特定字符
  • 原文地址:https://www.cnblogs.com/zhangjiuding/p/14388948.html
Copyright © 2011-2022 走看看