CCF201712-1 最小差值(100分)序列处理
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF201712-1 最小差值(100分)序列处理相关的知识,希望对你有一定的参考价值。
试题编号: 201712-1
试题名称: 最小差值
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
输入格式
输入第一行包含一个整数n。
第二行包含n个正整数,相邻整数之间使用一个空格分隔。
输出格式
输出一个整数,表示答案。
样例输入
5
1 5 4 8 20
样例输出
1
样例说明
相差最小的两个数是5和4,它们之间的差值是1。
样例输入
5
9 3 6 1 3
样例输出
0
样例说明
有两个相同的数3,它们之间的差值是0.
数据规模和约定
对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。
问题链接:CCF201712-1 最小差值
问题简述:(略)
问题分析:
重写解题博客以及解题程序代码(参见参考链接),解题逻辑更加清晰,解题代码更加简洁,多种语言解法。
根据题意,这是一个求所有数差值最小的问题。有两种方法可以解决,一是暴力法;二是先对所有数据进行排序,然后求相邻数差值的最小值(变成求最值问题)
方法一:暴力法
同样是暴力解决问题,一种是程序先读入数据再进行处理;另外一种是边读入数据边处理,算是一种编程技巧。暴力法的时间复杂度是O(n2)。
方法二:排序
对所有数据进行排序后,最小差值的数只可能是相邻的2个数。排序法的时间复杂度是O(nlogn)。
相比较而言,排序法似乎时间上更优一些。
其他语言解法程序
这里也分别给出Python语言和Java语言的解题程序各一个,上述解法都可以有的。
程序说明:(略)
参考链接:
CCF201712-1 最小差值(100分)
题记:(略)
100分的C语言程序(方法一:暴力法)如下:
/* CCF-CSP201712-1 最小差值 */
#include <stdio.h>
#include <stdlib.h>
#define N 1000
#define MAXA 10000
int a[N];
int main()
{
int n, i, j;
/* 读入数据 */
scanf("%d", &n);
for (i = 0; i < n; i++) scanf("%d", &a[i]);
/* 计算差值的最小值(暴力法) */
int mind = MAXA;
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++) {
int d = abs(a[i] - a[j]);
mind = d < mind ? d : mind;
}
/* 输出结果 */
printf("%d\\n", mind);
return 0;
}
100分的C语言程序(方法一:暴力法+流处理)如下:
/* CCF-CSP201712-1 最小差值 */
#include <stdio.h>
#include <stdlib.h>
#define N 1000
#define MAXA 10000
int a[N];
int main()
{
int n, i, j;
/* 读入数据, 计算差值的最小值(暴力法) */
int mind = MAXA;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
for (j = 0; j < i; j++) {
int d = abs(a[i] - a[j]);
mind = d < mind ? d : mind;
}
}
/* 输出结果 */
printf("%d\\n", mind);
return 0;
}
100分的C++语言程序(方法二:排序)如下:
/* CCF201712-1 最小差值 */
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000;
const int MAXA = 10000;
int a[N];
int main()
{
int n;
// 读入数据
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
// 排序
sort(a, a + n);
// 计算差值的最小值
int mind = MAXA;
for (int i = 1; i < n; i++) {
int d = a[i] - a[i - 1];
if (d < mind) mind = d;
}
// 输出结果
cout << mind << endl;
return 0;
}
100分的Python语言程序(方法二:排序)如下:
# CCF201712-1 最小差值
n = int(input())
nums = [int(num) for num in input().split()]
nums.sort() # 排序
mind = 10000
for i in range(n - 1):
d = nums[i + 1] - nums[i]
if (d < mind):
mind = d
print(mind)
100分的Java语言程序(方法二:排序)如下:
/* CCF201712-1 最小差值 */
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a[] = new int[n];
for (int i = 0; i < n; i++) a[i] = sc.nextInt();
Arrays.sort(a);
int mind = 10000;
for (int i = 1; i < n; i++) {
int d = a[i] - a[i - 1];
if (d < mind) mind = d;
}
System.out.print(mind);
}
}
以上是关于CCF201712-1 最小差值(100分)序列处理的主要内容,如果未能解决你的问题,请参考以下文章