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 _ 1 + a _ 2 + \dots + a _ i - a _ {i+1} - \dots - a _ 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现