CF1169C. Increasing by Modulo(二分)

简介: CF1169C. Increasing by Modulo(二分)

linkkkkk

题意:

给出n , k和数组a,每次都可以选出若干个元素让他们的值变成k( a i + 1 ) m o d

问最少需要几次操作才能使得数组非递减

思路:

操作次数是有单调性的,比如当x次可以成功的话,x + 1次也可以成功,最后一次可以调整最大或最小元素。考虑二分答案。

对于c h e c k,贪心的考虑,如果b i = = b i − 1,跳过;如果b i > b i − 1,已经满足要求了,为了有利于后面的操作,尽可能的让b i = b i − 1,所需要的操作次数为b [ i − 1 ] + k − b [ i ];如果b i < b i − 1

相等就可以了,所需要的操作次数为b [ i − 1 ] − b [ i ],如果b [ i − 1 ] − b [ i ] < m i d

代码:

// Problem: C. Increasing by Modulo
// Contest: Codeforces - Codeforces Round #562 (Div. 2)
// URL: https://codeforces.com/problemset/problem/1169/C
// Memory Limit: 256 MB
// Time Limit: 2500 ms
// 
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
int n,k,a[300007],b[300007];
bool check(int mid){
  for(int i=1;i<=n;i++) b[i]=a[i];
  for(int i=1;i<=n;i++){
    if(b[i]<b[i-1]){
      if(b[i-1]-b[i]>mid) return 0;
      b[i]=b[i-1];
    }
    else{
      if(b[i-1]+k-b[i]<=mid) b[i]=b[i-1];
    }
  }
  return 1;
}
int main(){
  cin>>n>>k;
  for(int i=1;i<=n;i++) cin>>a[i];
  int l=0,r=k,ans;
  while(l<=r){
    int mid=(l+r)/2;
    if(check(mid)) ans=mid,r=mid-1;
    else l=mid+1;
  }
  cout<<ans<<endl;
  return 0;
}


目录
相关文章
Light oj 1080 - Binary Simulation(树状数组区间更新点查询)
有一字符串只包含0和1,然后又m组操作,I L R是将从L到R的字符进行翻转操作0变为1、1变为0,Q x表示询问第x的字符。
43 0
|
搜索推荐 索引
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
|
vr&ar
CF482B. Interesting Array(线段树)
CF482B. Interesting Array(线段树)
66 1
《Towards A Fault-Tolerant Speaker Verification System A Regularization Approach To Reduce The Condition Number》电子版地址
Towards A Fault-Tolerant Speaker Verification System: A Regularization Approach To Reduce The Condition Number
89 0
《Towards A Fault-Tolerant Speaker Verification System A Regularization Approach To Reduce The Condition Number》电子版地址
CF1454 E. Number of Simple Paths (基环树 拓扑排序)
CF1454 E. Number of Simple Paths (基环树 拓扑排序)
94 0
|
人工智能
Kuroni and Impossible Calculation——容斥原理-鸽笼原理-抽屉原理
题目描述 已知一个数组a[n],请计算式子:∏_{1≤i<j≤n}|ai−aj| 的值,其中1<=i,j<=n;我们可以认为,这一式子等价于 |a1−a2|⋅|a1−a3|⋅ … ⋅|a1−an|⋅|a2−a3|⋅|a2−a4|⋅ … ⋅|a2−an|⋅ … ⋅|an−1−an|
126 0
Kuroni and Impossible Calculation——容斥原理-鸽笼原理-抽屉原理
HDOJ 2028 Lowest Common Multiple Plus(n个数的最小公倍数)
HDOJ 2028 Lowest Common Multiple Plus(n个数的最小公倍数)
130 0
|
人工智能
poj2356:Find a multiple
题目链接: 【鸽巢原理+乱搞】 其实用不着开$map$ 一步最巧妙的转化是$……$前缀和。 反正本宝宝突发奇想就出来了。 首先,我们分类讨论。 1.当$∃i \in N_{+} $ 且 $i \in [1,n]$ 使 $a_{i} | n$ 则直接选这个数就好 2.没有以上那种特殊情况的话,我们记录前缀和$sum_{i}= \sum _{k=1}^{i} a_{k} (mod \ \ n)$ 然后又有两种情况。
1179 0
|
机器学习/深度学习 存储 人工智能
下一篇
DataWorks