题目链接:http://codeforces.com/problemset/problem/1168/A


题意:给一个数组,数组中元素范围为0~n,每次你可以选择若干元素进行(ai+1)%m的操作,问使数组呈非递增的最小操作次数。

思路:因为每次都可以选若干个元素,用贪心思想,假设要操作x次,第一个元素加上x若能超过m,则对m取模最小值为0,令其等于0就好了,后面每个元素加上x后,对m取模后只要不比前面小就好了,则依次判断数组的每个元素能否满足,利用二分搜索来寻找 操作数 x,x即为答案。

AC代码:

 #include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 3e5 + ;
int a[maxn];
int n,m; bool check(int x)
{
int last = a[];
if(a[] + x >= m) last = ;//如果 a[0] 经过x次变换后大于 m 那么 a[0] 可以看做 0 。
for(int i = ;i < n;i++)
{
int temp = -;//存放a[i]与last更大的那个。
if(a[i] >= last)
{
temp = a[i];
//如果经过x次变换后 a[i] 可以比前面大,那么temp存放前面的值就行。
if(a[i] + x >= m && (a[i] + x) % m >= last)
{
temp = last;
}
}
else if(a[i] + x >= last) temp = last;
if(temp == -) return false;//找不到比前面更大的a[i]。
last = temp;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = ;i < n;i++)
{
scanf("%d",&a[i]);
}
int l = ,r = m + ,ans = ;
while(l <= r)
{
int mid = (l + r) >> ;
if(check(mid)) r = mid - ,ans = mid;
else l = mid + ;
}
printf("%d\n",ans);
return ;
}

最新文章

  1. J2EE学习笔记-第二章(Web应用初步)
  2. Vim经典讲解
  3. Redis系列-存储篇set主要操作函数小结
  4. Windows Azure使用必读(转)
  5. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
  6. java学习笔记day07
  7. PictureBox从本地上传图片和保存在磁盘目录
  8. 使用fat jar和exe4j把java程序打包成exe执行文件---转载的
  9. POJ 3154 Graveyard【多解,数论,贪心】
  10. vue入坑教程(一)
  11. java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
  12. flask同源策略解决办法及flask-cors只允许特定域名跨域
  13. ckeditor5 安装高亮,颜色插件
  14. selenium Grid2 分布式自动化测试环境搭建
  15. rails gem更换ruby-china源
  16. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(八):MyBatis分页功能实现
  17. sagas
  18. poj1696 Space Ant【计算几何】
  19. Swift - 多线程GCD详解
  20. sharepoint content type publishing

热门文章

  1. Delphi实现提取可执行文件内部所有图标
  2. (转)OpenFire源码学习之十二:HttpBind&amp;Script Syntax
  3. jenkins的api操作
  4. Openstack组件部署 — Nova_Install and configure a compute node
  5. HDU 5251 矩形面积 (旋转卡壳)
  6. 【Java多线程系列三】实现线程同步的方法
  7. Spring IOC源码分析(二):Bean工厂体系结构设计
  8. Spring MVC源码分析(二):SpringMVC的DispatcherServlet的设计与实现
  9. swagger使用详解
  10. Summary 报告