当前位置: 首页> 游戏> 游戏 > 南宁网站制作网络公司_东营智能网站设计_楼市最新消息_深圳关键词推广

南宁网站制作网络公司_东营智能网站设计_楼市最新消息_深圳关键词推广

时间:2025/7/14 18:38:39来源:https://blog.csdn.net/2401_88124450/article/details/145577826 浏览次数:1次
南宁网站制作网络公司_东营智能网站设计_楼市最新消息_深圳关键词推广

题目一 :

AC代码

#include <stdio.h>
#include <stdlib.h>// 定义长整型
typedef long long ll;// 定义求最大值和最小值的宏函数
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))// 定义数组和变量
ll n, m;
ll a[200010];
ll x, y;
ll b = 0;  // 原 mx 改为 b
// 初始化最小值为一个较大的值
ll c = 0x3f3f3f3f;  // 原 mi 改为 cint main() {// 输入 n 和 mscanf("%lld %lld", &n, &m);// 输入数组 a 的元素for (int i = 1; i <= n; i++) {scanf("%lld", &a[i]);}// 输入 m 组 x 和 y,并找出最大的 xfor (int i = 1; i <= m; i++) {scanf("%lld %lld", &x, &y);b = MAX(b, x);}// 从 b 到 n 中找出最小的元素for (int i = b; i <= n; i++) {c = MIN(c, a[i]);}// 输出最小值printf("%lld", c);return 0;
}

 题解:

1.typedef long long ll;:将 long long 类型重命名为 ll,方便后续使用

2. 宏定义
// 定义求最大值和最小值的宏函数
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))

 #define MAX(a, b) ((a) > (b) ? (a) : (b)):定义了一个宏函数 MAX,用于比较两个数 ab 的大小,返回其中较大的数。

#define MIN(a, b) ((a) < (b) ? (a) : (b)):定义了一个宏函数 MIN,用于比较两个数 ab 的大小,返回其中较小的数。

3.ll c = 0x3f3f3f3f;:用于记录从 b 位置开始到数组 a 末尾的元素中的最小值,初始值设为一个较大的数 0x3f3f3f3f,这样后续比较时可以方便地更新最小值。

4.输入 m(x, y) 数据并找出最大的 x

// 输入 m 组 x 和 y,并找出最大的 x
for (int i = 1; i <= m; i++) {scanf("%lld %lld", &x, &y);b = MAX(b, x);
}

使用 for 循环读取 m(x, y) 数据。

每次读取后,使用 MAX 宏函数比较当前的 x 和之前记录的最大值 b,将较大的值更新为新的 b

5.总结:这段代码的核心逻辑是先读取数组元素和若干组 (x, y) 数据,找出 x 中的最大值,然后在数组中从该最大值对应的位置开始到数组末尾找出最小值并输出。通过宏函数 MAXMIN 简化了比较操作

题目二:

 

AC代码 :

#include <stdio.h>// 比较函数,用于 qsort 从大到小排序
int c(const void *x, const void *y) {return (*(int *)y - *(int *)x);
}int main() {int n, m;int a[15005], b[15005], s;// 读取 n 和 m 的值scanf("%d%d", &n, &m);// 读取数组 a 的元素for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);}// 计算总长度s = a[n] - a[1] + 1;// 计算每一个坑的距离for (int i = 1; i < n; i++) {b[i] = a[i + 1] - a[i];}// 使用 qsort 函数对数组 b 从大到小排序qsort(b + 1, n - 1, sizeof(int), c);// 从中间舍去 m - 1 段不需要的最长的路段for (int i = 1; i < m; i++) {s = s - b[i] + 1;}// 输出结果printf("%d\n", s);return 0;
}

题解 :

1.int c(const void *x, const void *y):这是一个用于 qsort 函数的比较函数,目的是让数组按照从大到小的顺序排序。qsort 是 C 语言标准库中的排序函数,它需要一个比较函数作为参数。const void *xconst void *y 是两个指向要比较元素的指针,通过 *(int *)x*(int *)y 将指针转换为 int 类型并取值,然后返回 *(int *)y - *(int *)x,如果结果大于 0,则 y 应该排在 x 前面,从而实现从大到小排序。

2.计算初始总长度

    // 计算总长度s = a[n] - a[1] + 1;

s = a[n] - a[1] + 1;:计算所有点构成的最大区间的长度,即最后一个点的位置减去第一个点的位置再加上 1。

3.计算相邻点之间的距离 

    // 计算每一个坑的距离for (int i = 1; i < n; i++) {b[i] = a[i + 1] - a[i];}

for (int i = 1; i < n; i++) { b[i] = a[i + 1] - a[i]; }:通过循环计算相邻点之间的距离,将结果存储到 b 数组中。 

4.对间隔进行排序

    // 使用 qsort 函数对数组 b 从大到小排序qsort(b + 1, n - 1, sizeof(int), c);

qsort(b + 1, n - 1, sizeof(int), c);:调用 qsort 函数对 b 数组中从第二个元素开始的 n - 1 个元素进行从大到小的排序,sizeof(int) 表示每个元素的大小,c 是前面定义的比较函数。

5.合并区间 

    // 从中间舍去 m - 1 段不需要的最长的路段for (int i = 1; i < m; i++) {s = s - b[i] + 1;}

for (int i = 1; i < m; i++) { s = s - b[i] + 1; }:通过循环舍去 m - 1 个最大的间隔,每次减去一个间隔的长度并加上 1,更新总长度 s

6.总结 :这段代码通过读取输入的点和区间数量,计算相邻点之间的距离,对距离进行排序,然后舍去部分最大的距离,最终得到最小的总长度并输出。

 

关键字:南宁网站制作网络公司_东营智能网站设计_楼市最新消息_深圳关键词推广

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: