codeforces Round 971 div4

A. Minimize!

给你两个整数 $$$a$$$$$$b$$$ ( $$$a \leq b$$$ )。在 $$$c$$$ ( $$$a \leq c \leq b$$$ ) 的所有可能整数值中,求 (c - a) + (b - c)$$$ 的最小值。
题目问(c-a)+(b-c)的最小值,由于c在a到b之间所以只需枚举a到b的每一个数来寻找最小值```
`#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int t;
const int N = 114514;
int p[N];
int ans;
int main()
{
	cin >> t;
	while (t--)
	{
		int a, b;
		int res=0x3f3f3f;
		cin >> a >> b;
		for (int i = a; i <= b; i++)
		{
			res = min(res, (i - a) + (b - i));
			
		}
		ans++;
		p[ans] = res;
	}
	for (int i = 1; i <= ans; i++)
	{
		cout << p[i] << endl;
	}










	return 0;
}
`
B. osu!mania
您正在玩您最喜欢的节奏游戏 osu!mania。您的节拍图布局包括 $$$n$$$ 行和 $$$4$$$ 列。由于最下面的音符距离较近,因此您将先处理最下面的一行,最后处理最上面的一行。每一行将包含一个音符,用 "#"表示。

对于每个音符 $$$1, 2, \dots, n$$$ ,按照处理顺序,输出该音符所在的列。
由于本题是从下往上进行处理,所以枚举时从最后一行开始。
`#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 1100;
char a[N][5];
int t;
int n;
int g[N];
bool col[N];
void answer()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= 4; j++)
		{
			cin >> a[i][j];
		}
	}
	for (int i = n; i >= 1; i--)
	{

		for (int j = 1; j <= 4; j++)
		{
			if (a[i][j] == '#')
			{
				cout << j<<" ";
				break;
			}
		}
		
	}
	cout << endl;
}
int main()
{
	cin >> t;
	while (t--)
	{
		answer();
		
	}







}`

C. The Legend of Freya the Frog
青蛙弗莱娅正在二维坐标平面上旅行。她目前在点 $$$(0,0)$$$ ,想去点 $$$(x,y)$$$ 。在一次移动中,她选择了一个整数 $$$d$$$ ,使得 $$$0 \leq d \leq k$$$$$$d$$$ 点沿她面对的方向向前跳跃。

最初,她面向的是正方向 $$$x$$$ 。每次移动后,她将交替朝向正 $$$x$$$ 方向和正 $$$y$$$ 方向(即第二次移动时朝向正 $$$y$$$ 方向,第三次移动时朝向正 $$$x$$$ 方向,以此类推)。

她最少要走多少步才能到达点 $$$(x,y)$$$ ?

本题感觉与贪心有关,每次均走可以走的最大步数,然后向上取整。
如果先走完横坐标的距离,最少步数=(到横坐标的步数)*2;
否则最少步数-1;
`#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

int t;

int main()
{
	cin >> t;
	while (t--)
	{
		double x, y, k;
		cin >> x >> y >> k;
		
		long long res = max(ceil(x / k),ceil(y / k));//x先到。
		long long sum = res * 2;
		
		if (ceil(x / k) > ceil(y / k))
		{
			sum -= 1;
		}
		cout << sum << endl;
	}
  



	return 0;
}`

E. Klee's SUPER DUPER LARGE Array!!!
Klee 有一个长度为 $$$n$$$ 的数组 $$$a$$$ ,其中包含依次排列的整数 $$$[k, k+1, ..., k+n-1]$$$ 。克利希望选择一个索引 $$$i$$$ ( $$$1 \leq i \leq n$$$ ),使得 $$$x = |a &#95; 1 + a &#95; 2 + \dots + a &#95; i - a &#95; {i+1} - \dots - a &#95; n|$$$ 最小。请注意,对于任意整数 $$$z$$$ , $$$|z|$$$ 表示 $$$z$$$ 的绝对值。

输出 $$$x$$$ 的最小可能值。
本题由于数组中的元素有递增的关系所以可以进行二分来解决。
由于x可以看作一个二次函数,所以只需对其左边以及右边分别接近其零点,最后比较左右的最小值即可。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
long long t;
long long n, k;

long long check(long long x)
{
	long long sum = 0;
	sum += ((k + k + x - 1) * x / 2);
	sum -= ((k + x + k + n - 1) * (n - x) / 2);
	return sum;
}

int main()
{
	cin >> t;
	while (t--)
	{


		cin >> n >> k;
		long long l = 1, r = n;
		while (l<r)
		{
			long long mid = (l + r) >> 1;//二分出i的值。
			if (check(mid) <= 0)//二次函数左边。
			{
				l =1+mid;
			}
			else
			{
				r = mid;
			}
		}

		cout << min(abs(check(l-1)), abs(check(l))) << endl;


	}







	return 0;
}
posted @   lixinran1006  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示