首页 > 其他分享 >二分找最小绝对值

二分找最小绝对值

时间:2024-11-14 16:57:25浏览次数:1  
标签:二分 Klee int mid long 最小 leq 绝对值 数组

Klee's SUPER DUPER LARGE Array!!!

每次测试时间限制:2秒

每次测试的内存限制:256 MB

题目描述

Klee 拥有一个长度为 n 的数组 a,数组中的元素依次为 [k, k + 1,..., k + n - 1]。Klee 希望选择一个索引 i(1≤i≤n),使得 x = |a1 + a2 + ⋯ + ai - ai+1 - ⋯ - an| 最小。其中对于任意整数 z,|z| 表示 z 的绝对值。要求输出 x 的最小值。

输入格式

第一行包含 \(t\) ( \(1 \leq t \leq 10^4\) )—测试用例的数量。

每个测试用例包含两个整数 \(n\) 和 \(k\) ( \(2 \leq n, k \leq 10^9\) )—数组的长度和数组的起始元素。

输出格式

对于每个测试用例,在新的一行上输出 \(x\) 的最小值。

样例 #1

样例输入 #1

4
2 2
7 2
5 3
1000000000 1000000000

样例输出 #1

1
5
1
347369930

提示

注意

在第一个示例中, \(a = [2, 3]\) 。当选择 \(i = 1\) 时, \(x = |2-3| = 1\) 。可以看出,这是 \(x\) 的最小可能值。

在第三个样本中, \(a = [3, 4, 5, 6, 7]\) 。当选择 \(i = 3\) 时, \(x = |3 + 4 + 5 - 6 - 7| = 1\) 。可以看出,这是 \(x\) 的最小可能值。






题解

注意到本题中,最后一个样例过大,而题设的数组是公差为1的等差数列,很容易想到,等差数列求和公式。(死去的高中知识怎么在攻击我??)

\[S_n = \frac{n(a_1 + a_n)}{2} ~~~~~ 或者 ~~~~~ S_n = \frac{n[2a_1 + (n-1)d]}{2} \]

#include <iostream> 
using namespace std;

long long n, l, r, mid;
int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		long long k;
		scanf("%d%lld", &n, &k);

		l = 0; r = n;
		long long  ans = 0;
		for (int i = 1; i < n; i++) {
		}
		ans =10 * (n+k);

		while (l <= r) {
			mid = (l + r) >> 1;

			long long sum = 0; int num = 0;
			int nn = n;


			long long add = 0, sub = 0;

			//等差数列求和;死去的记忆正在攻击我
			add = mid * (2 * k + mid - 1) / 2;
			sub = (n - mid)*(2 * k + n + mid - 1) / 2;

			sum = add - sub;


			long long sum1 = abs(sum);
			if (sum1 <= ans) ans = sum1;


			if (sum > 0) r = mid - 1;
			else l = mid + 1;

		}
		printf("%d\n", ans);
	}
	return 0;
}

标签:二分,Klee,int,mid,long,最小,leq,绝对值,数组
From: https://www.cnblogs.com/phuzzz/p/18545853

相关文章

  • 整数二分查找 leetcode35. 搜索插入位置 leetcode704. 二分查找
    这两道题的本质是一样的,都是整数二分查找。题目给出的条件比较强,序列是严格单调递增的。但是我这个即使序列存在重复的元素也可以满足需求35.搜索插入位置classSolution{public:intsearchInsert(vector<int>&nums,inttarget){intsize=nums.size();......
  • 代码随想录:二分查找
    代码随想录:二分查找二分法标志:数组顺序排列且无重复简单的二分法,写法是左闭右闭的写法,此种情况的left可以等于right,故while里有等号。classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;......
  • 2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义
    2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k,定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值。找出nums中长度为k的所有子序列的能量和,对结果取模10^9+7后返回。输入:nums=[1,2,3,4],k=3。输出:4。解释:......
  • 二分查找(折半查找)函数与非函数写法代码介绍及其优缺点 C语言
    什么是二分查找?二分查找也叫折半查找 在有序的数组中查找目标的方法需要借助中间元素与目标值的比较来逐步缩小范围一直到找到目标元素或者不存在为止查找的步骤↓1确定左右端点的下标值(注:数组下标从0开始)2计算中间下标位置3比较中间下标位置的数组值与目标值的大......
  • 最小生成树
    最小生成树模板题:【模板】最小生成树求最小生成树的边权和。Prim这似乎是我最早学的最小生成树算法。也是忘的最早的首先注意到,由\(n\)个节点和$n-1$条边构成的连通图一定是树。那么只需要选\(n-1\)条边使图连通,求最小代价。不难发现只要保证结果不出现环就可能是......
  • 2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义
    2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k,定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值。找出nums中长度为k的所有子序列的能量和,对结果取模10^9+7后返回。输入:nums=[1,2,3,4],k=3。输出:4。解释:nums......
  • 数列分段(二分)
    [数列分段SectionII]题目描述对于给定的一个长度为\(N\)的正整数数列\(A_{1\simN}\),现要将其分成\(M\)(\(M\leqN\))段,并要求每段连续,且每段和的最大值最小。关于最大值最小:例如一数列\(4\2\4\5\1\)要分成\(3\)段。将其如下分段:\[[4\2][4\5][1]\]第一段和为......
  • C小题目:输入10个整数,将其中最小的数与第1个数对换,将最大的数与最后一个对换。要求写3
    题目要求如下:输入10个整数,将其中最小的数与第1个数对换,将最大的数与最后一个对换。要求写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。提示:(1)定义voidinput(int*p)函数,用来输入10个整数,存放到指针变量p所指向的数组中;(2)定义voidmax_min_value(int*p)函数,在指针变量p所指......
  • 整数二分—建造水族馆
    建造水族馆每次测试时限:2秒每次测试的内存限制:256兆字节输入:标准输入输出:标准输出题目:你喜欢养鱼,所以你决定建造一个水族馆。你有一块由n根柱子组成的珊瑚,其中i根柱子高ai个单位。之后,你将在珊瑚周围建造一个水族箱,具体如下:选取一个整数h>=1--水箱的高度。在水箱两侧建......
  • Scratch自制积木(自定义函数)求最小公倍数
    在Scratch编程环境中,自制积木是一种用户定义的代码块,它可以将复杂的脚本简化为更易于理解和管理的部分。通过自制积木,用户可以将一系列指令封装成一个单独的积木块,从而方便地在不同的项目中重用这些指令。Scratch自制积木功能是一个强大且灵活的工具,它可以帮助用户更好地组织......