首页 > 其他分享 >CF1904C Array Game

CF1904C Array Game

时间:2024-01-30 18:15:58浏览次数:35  
标签:int 每组 Game ++ 枚举 数组 CF1904C Array 最小值

题目传送门

codeforces

洛谷

题目大意

给你一个由 \(n\) 个正整数组成的数组 \(a\) 。在一次操作中,选取 \((i, j)\) ,将 \(|a_i - a_j|\) 加到 \(a\) 的末尾。你的任务是在执行 \(k\) 操作后,最小化最后数组 \(a\) 的最小值。

思路

分三种情况:

  • \(k \geq 3\) 时,我们可以取两次相同的 \(|a_i - a_j|\) ,这样数组中就会出现两个相同的数,第三次操作取这两个相同的数即可,可以保证最小值为 \(0\) ;

  • \(k=1\) 时,我们暴力枚举每组 \(|a_i - a_j|\) ,然后直接取数组 \(a\) 和枚举出的每组 \(|a_i - a_j|\) 的最小值;

  • \(k=2\) 时,我们考虑先暴力枚举出每组 \(|a_i - a_j|\) ,并对原数组 \(a\) 排序,对于每个得到的 \(|a_i - a_j|\) ,在排好序的原数组 \(a\) 中二分找到与这个值最接近的数,和它取差值,最后答案就是原数组 \(a\) 、暴力枚举出每个 \(|a_i - a_j|\) 、二分找到的数取的差值,这三组数中的最小值。

最坏情况时间复杂度 \(O(n^{2}\log{n})\) ,可以接受。

代码

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve()
{
	int n, k;
	cin >> n >> k;
	vector<int> a(n);
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	if (k >= 3)
	{
		cout << 0 << endl;
		return;
	}
	int minn = LLONG_MAX;
	for (int i = 0; i < n; i++)
	{
		minn = min(minn, a[i]);
	}
	vector<int> b;
	for (int i = 0; i < n; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			int c = abs(a[i] - a[j]);
			b.push_back(c);
			minn = min(minn, c);
		}
	}
	if (k == 1)
	{
		cout << minn << endl;
		return;
	}
	sort(a.begin(), a.end());
	for (auto i : b)
	{
		int l = 0, r = n - 1, mid, d = 0;
		while (l <= r)
		{
			mid = (l + r) >> 1;
			if (a[mid] <= i)
			{
				l = mid + 1;
				d = mid;
			}
			else
			{
				r = mid - 1;
			}
		}
		minn = min(minn, abs(a[d] - i));
		if (d != n - 1)
			minn = min(minn, abs(a[d + 1] - i));
	}
	cout << minn << endl;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	{
		solve();
	}
}

标签:int,每组,Game,++,枚举,数组,CF1904C,Array,最小值
From: https://www.cnblogs.com/Zinc-Acetate/p/17997678

相关文章

  • ArrayList 扩容规则和 fail-fast 和fail-sale
    初始长度为0数组ArrayList()会使用长度为0的数组ArrayList(intinitalCapacity)会使用自定容器的数组 如果初始不是0add()首次扩容为10,再次扩容为1.5倍addAll()会在元素与下次扩容1.5倍选最大值 Iterator(迭代器)遍历集合遍历set集合,遍历list集合,编辑map集合fail......
  • 31-ArrayList和HashMap集合的排序
     扩展:在List集合中添加另一个集合时,一般常用两种方法booleanadd(Ee): 将list作为一个元素添加到集合中booleanaddAll(Collection<?extends E> c):把list中的所有元素添加到集合中 ArrayList类的排序方法(常用)packagelist;importjava.util.ArrayList......
  • vue父子组件数据传递props中Object和Array如何设置默认值
      props:{field:{type:String},index:{type:Number,default:0},isAble:{type:Boolean,default:true},rowData:{type:Object,default:function(){return{};......
  • uniapp ArrayBuffer转16进度字符串 以及 十六进制转ASCII码
    1.ArrayBuffer转16进度字符串//ArrayBuffer转16进度字符串示例//ab2hex(buffer){//consthexArr=Array.prototype.map.call(//newUint8Array(buffer),//function(bit){//......
  • 深入了解Java中的ArrayList
    Java中的ArrayList是一个常用的动态数组类,它提供了便捷的操作方法和灵活的大小调整能力。在本篇博客中,我们将深入了解ArrayList的特性、常见用法和一些注意事项。ArrayList概述:ArrayList是Java集合框架中的一个类,它实现了List接口,并继承了AbstractList类。它基于数组实现,可以动......
  • C#数组对象池ArrayPool<T>底层
    深度解析C#数组对象池ArrayPool<T>底层原理 提到池化技术,很多同学可能都不会感到陌生,因为无论是在我们的项目中,还是在学习的过程的过程,都会接触到池化技术。池化技术旨在提高资源的重复使用和系统性能,在.NET中包含以下几种常用的池化技术。(1)、连接池(Connecti......
  • 无涯教程-Scala - 数组(Arrays)
    Scala提供了一种数据结构数组,它存储了相同类型元素的固定大小的顺序集合。声明数组要在程序中使用数组,必须声明一个变量以引用该数组,并且必须指定该变量可以引用的数组的类型。varz:Array[String]=newArray[String](3)orvarz=newArray[String](3)在此,z被声明为可容......
  • Higress × OpenKruiseGame 游戏网关最佳实践
    作者:赵伟基、力铭、澄潭OpenKruiseGame(下文简称:OKG)是一个面向多云的开源游戏服Kubernetes工作负载,是CNCF工作负载开源项目OpenKruise在游戏领域的子项目,其提供了热更新、原地升级、定向管理等常用的游戏服管理功能。而游戏作为典型的流量密集型场景,在吞吐量、延迟性能、弹性......
  • Higress × OpenKruiseGame 游戏网关最佳实践
    作者:赵伟基、力铭、澄潭OpenKruiseGame(下文简称:OKG)是一个面向多云的开源游戏服Kubernetes工作负载,是CNCF工作负载开源项目OpenKruise在游戏领域的子项目,其提供了热更新、原地升级、定向管理等常用的游戏服管理功能。而游戏作为典型的流量密集型场景,在吞吐量、延迟性能、弹......
  • 深度解析C#数组对象池ArrayPool<T>底层原理
    提到池化技术,很多同学可能都不会感到陌生,因为无论是在我们的项目中,还是在学习的过程的过程,都会接触到池化技术。池化技术旨在提高资源的重复使用和系统性能,在.NET中包含以下几种常用的池化技术。(1)、连接池(ConnectionPool):用于管理数据库连接的池化技术。连接池允......