CF1169C. Increasing by Modulo(二分)

2023-05-16

linkkkkk
题意:
给出 n , k n,k n,k和数组 a a a,每次都可以选出若干个元素让他们的值变成 ( a i + 1 ) m o d    k (a_i+1)\mod k (ai+1)modk
问最少需要几次操作才能使得数组非递减
思路:
操作次数是有单调性的,比如当 x x x次可以成功的话, x + 1 x+1 x+1次也可以成功,最后一次可以调整最大或最小元素。考虑二分答案。
对于 c h e c k check check,贪心的考虑,如果 b i = = b i − 1 b_i==b_{i-1} bi==bi1,跳过;如果 b i > b i − 1 b_i>b_{i-1} bi>bi1,已经满足要求了,为了有利于后面的操作,尽可能的让 b i = b i − 1 b_i=b_{i-1} bi=bi1,所需要的操作次数为 b [ i − 1 ] + k − b [ i ] b[i-1]+k-b[i] b[i1]+kb[i];如果 b i < b i − 1 b_i<b_{i-1} bi<bi1,那么 b i b_i bi一定要增大,跟 b i − 1 b_{i-1} bi1相等就可以了,所需要的操作次数为 b [ i − 1 ] − b [ i ] b[i-1]-b[i] b[i1]b[i],如果 b [ i − 1 ] − b [ i ] < m i d b[i-1]-b[i]<mid b[i1]b[i]<mid的话说明次数是不可行的,直接返回 f a l s e false false
代码:

// 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CF1169C. Increasing by Modulo(二分) 的相关文章

  • 【leetcode】674. 最长连续递增序列(longest-continuous-increasing-subsequence)(DP)[简单]

    链接 https leetcode cn com problems longest continuous increasing subsequence 耗时 解题 xff1a 57 min 题解 xff1a 21 min 题意 给定一个未经
  • gcc 在使用 fmod() 时出错

    fmod 的示例代码 include
  • 模数运算符运行第一项,然后每第三项运行

    所以我需要它在第一个循环上运行 然后在每个第三个循环上运行 if k 3 k 1 echo div class modcontainer 对我来说似乎很简单 但我不了解模数 模数返回余数 而不是布尔值 这段代码将解析为true for 1
  • iOS Objective-C:在浮点数上使用模数从脚中获取“英寸”

    我正在尝试制作一个简单的 Objective C 高度转换器 输入是英尺的 浮点 变量 我想转换为 int 英尺和 浮点 英寸 float totalHeight 5 122222 float myFeet int totalHeight
  • 为什么我们需要 IEEE 754 余数?

    我刚刚读过这个话题 尤其是最后的评论 然后我想知道 为什么我们真正需要这个是为了给剩下的 但似乎之前没有多少人 在谷歌上 对此感兴趣 如果您正在寻找想要它的原因 其中之一就是所谓的 范围缩小 假设你想要sind用于计算参数正弦值 以度为单位
  • JavaScript %(模)对于负数给出负结果

    根据谷歌计算器 13 64 is 51 根据 Javascript 参见此JSBin it is 13 我该如何解决 Number prototype mod function n use strict return this n n n
  • 如何计算a^b^c mod p?

    我正在尝试计算一些正整数 a b c p 的 a b c mod p 一种可能的 也是显而易见的 方法是使用快速模幂 它将运行在O log b c clog b 虽然我不介意这里的效率 但这种方法的明显缺点是您需要一个显式的二进制表示b c
  • 为什么哈希函数除法只使用素数

    使用除法进行哈希意味着 h k k mod m 我读到了 m 不应该是 2 的幂 这是因为如果 m 2 p h 就变成 只是 k 的 p 个最低位 通常我们选择m作为素数 数字不太接近 2 的幂 有人可以用一个小例子解释最低阶位部分吗 我认
  • 判断变量是否能被 2 整除

    如何判断一个变量能否被2整除 此外 如果是 我需要执行一个函数 如果不是 我需要执行一个不同的函数 使用模数 Will evaluate to true if the variable is divisible by 2 variable
  • 检查奇数时 & 比 % 更快吗?

    要检查奇数和偶数 最低位检查是否比使用模数更有效 gt gt gt def isodd num return num 1 and True or False gt gt gt isodd 10 False gt gt gt isodd 9
  • 如何在 MIPS 汇编中找到没有除法或模运算符的余数

    我想找到一种方法来知道一个整数是除以3还是7而不使用除法 因为它在MIPS汇编中非常慢 我做了很多研究但一无所获 有一种方法描述为格兰隆德和蒙哥马利 https gmplib org tege divcnst pldi94 pdf需要 奇
  • 如何在 MIPS 中正确使用 mod 运算符?

    在 MIPS 中 我对如何让 mod 工作感到困惑 下面是我迄今为止提出的代码 除了 mod 之外 我可能还有更多错误 但我觉得这些错误是 mod 误解的结果 我想做的就是在这里获取工作代码 python i 1 k 0 while i l
  • 哈希表大小和键的有效位

    我有一个关于哈希表大小和模块化哈希的问题 我指的哈希算法如下 hash key table size array index 我正在阅读一本算法教科书 其中给出了以下建议 如果表大小不是素数 则可能会出现键的所有位在确定 array ind
  • Math.pow(65,17) % 3233 的令人惊讶的结果

    由于某种原因 在处理大数时 模运算符没有给出正确的输出 请查看代码 double x Math pow 65 17 3233 输出应该是2790但输出是887 0 我确信这很愚蠢 但我无法绕过它 提前致谢 的结果Math pow 65 17
  • 在 C# 中,如何像 google calc 一样实现模数?

    我有一个代表形状的类 Shape 类有一个名为 Angle 的属性 我希望此属性的设置器自动将值包装到范围 0 359 中 不幸的是 一个简单的 Angle value 360 仅适用于正数 在 C 中 40 360 40 谷歌计算器可以做
  • 识别何时使用模运算符

    我知道modulus http en wikipedia org wiki Modulo operation 运算符计算除法的余数 如何确定需要使用模运算符的情况 我知道我可以使用模运算符来查看数字是偶数还是奇数 素数还是合数 但仅此而已
  • 红宝石:能被4整除

    这工作正常 但我想让它更漂亮 并容纳所有能被 4 整除的值 if i 4 i 8 i 12 i 16 i 20 i 24 i 28 i 32 end 有什么聪明 简短的方法可以做到这一点吗 尝试这个 if i 4 0 这被称为 模运算符 h
  • 模运算符 (%) 实际上是如何计算的?

    最近我对模运算符感到困惑 据了解a b a a b b当我们有整数时a and b where a gt b 如果a and b足够小 然而 当谈到处理器的计算方式时 处理器是否使用与前面提到的相同的方法 a a b b 也许只是将除法翻译
  • 编译时(constexpr)浮点模?

    考虑以下函数 该函数在编译时根据参数类型计算积分或浮点模 template
  • 使用迭代器将数组划分为大小不等的部分

    我有一个数组 需要将其分为 3 元素子数组 我想用迭代器来做到这一点 但最终我迭代到了数组的末尾并出现段错误即使我没有取消引用迭代器 给定 auto foo 1 2 3 4 5 6 7 8 9 10 我正在做 auto bar cbegin

随机推荐