|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题描述
数轴上有n个数字,求最近的两个数,即min(abs(x-y))
输入格式
第一行包含一个整数n。
接下来一行,表示n整数。
输出格式
一个整数表示最小距离
样例输入
6
7 3 4 11 9 17
样例输出
1
处理少数答案是对的,但处理庞大数据时候运行超时
- #include<stdio.h>
- #include<stdlib.h>
- int num[100001];
- int main() {
- int n, i, j;
- scanf("%d", &n);
- for (i = 0; i < n; i++) {
- scanf("%d", &num[i]);
- }
- int min, flag = 1;
- for (i = 0; i < n; i++) {
- for (j = 0; j < n; j++) {
- if (i == j) // 匹配到自己则跳过
- continue;
- if (flag == 1) { // 存放第一个最小数
- min = abs(num[i] - num[j]);
- flag--;
- }
- if (min > abs(num[i] - num[j])) // 比较
- min = abs(num[i] - num[j]);
- }
- }
- printf("%d", min);
- return 0;
- }
复制代码
本帖最后由 jackz007 于 2021-11-3 00:27 编辑
再测试一下这个代码呢?
- #include <stdio.h>
- #include <stdlib.h>
- int foo(int a , int b)
- {
- return (a > b) ? a - b : b - a ;
- }
- int main(void)
- {
- int * d , e , i , j , k , n ;
- scanf("%d" , & n) ;
- if(n > 1) {
- if(d = (int * ) malloc(sizeof(int) * n)) {
- for(i = 0 ; i < n ; i ++) scanf("%d" , & d[i]) ;
- for(k = foo(d[1] , d[0]) , i = 0 ; i < n - 1 ; i ++) {
- for(j = i + 1 ; j < n ; j ++) {
- e = foo(d[j] , d[i]) ;
- if(e < k) {
- k = e ;
- }
- }
- }
- printf("%d\n" , k) ;
- free(d) ;
- } else {
- fprintf(stderr , "内存分配失败!\n") ;
- }
- }
- }
复制代码
编译、运行实况:
- D:\00.Excise\C>g++ -o x x.c
- D:\00.Excise\C>x < x.txt
- 14
- D:\00.Excise\C>
复制代码
看看运行时间是否超时
|
|