Codeforces Round #641 (Div. 2)D. Orac and Medians

前言:好久没写题解了,虽然一直在刷,但是懒。。


题目传送门

D. Orac and Medians
  题目类型:思维、中位数、转换。
  解析:从最简单的想:选两个数,那么会转换为较小的数,只要有一个≥k的数在k旁边,就能整出2个连续k。那么就可以选两个k加一个其他数,一起变成k,重复就全部变成k了。
  如果k旁边的数都小于k,那么可以让≥k的数靠近k。
  设x≥k,问题就转化为整出连续的(≥2)x。那么要求3个数中要有2个≥k,4个中有3个,5个中有3个…可以发现3个中有2个是整出连续x的充分必要条件。(4个中有3个,5个中有3个…是包含3个中有2个的(鸽巢平分))。
  所以就看是否存在3个中有两个≥k的,特判n==1

  code:

void solve(){
    
    
    ll flag = 0;
    for(ll i = 1 ; i <= n ; ++i)
        flag += (a[i] == k);
    if(!flag)cout << "NO" << endl ;
    else if(n == 1)cout << "YES" << endl ;
    else {
    
    
        for(ll i = 1 ; i <= n ; ++i){
    
    
            ll sum = 0;
            for(ll j = i ; j <= n && j <= i+2 ; ++j)
                sum += (a[j] >= k);
            if(sum >= 2){
    
    
                cout << "YES" << endl ;
                return;
            }
        }
        cout << "NO" << endl ;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_45699242/article/details/121332672