列表

详情


WY59. 数轴

描述

牛牛非常喜欢和朋友们一起玩。
牛牛有n个朋友当前在一根数轴上,每个朋友当前在整数x[i]坐标位置。
牛牛向他们发出一个移动的信号,每个朋友就向左或者向右移动s距离(每个朋友的选择是独立的,都可以选择向左或者向右)。
为了在一起玩耍方便,牛牛希望移动之后最左边的朋友和最右边的朋友距离最近,牛牛想知道最近距离为多少。

例如牛牛有三个朋友分别所在数轴坐标为-7, 4, 7, s = 5
那么第一个朋友-7向右移动s,变为-2
第二个朋友4向左移动s,变为-1
第三个朋友7向左移动s,变为2。
现在最左和最右的朋友距离是4,没有比这个更优的方案了。

输入描述

输入包括两行,第一行两个正整数n和s(2 ≤ n ≤ 50, 0 ≤ s ≤ 10^8),表示朋友的个数和移动的距离。 第二行包括n个正整数x[i](-10^8 ≤ x[i] ≤ 10^8),表示初始时每个朋友所在的坐标位置。

输出描述

输出一个正整数,表示移动之后最左边的朋友和最右边的朋友最小距离为多少。

示例1

输入:

3 5
4 -7 7

输出:

4

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2019-08-08

#include<stdio.h>
#include<stdlib.h>

#define MAX(a, b) (((a)>(b))?(a):(b))
#define MIN(a, b) (((a)<(b))?(a):(b))

const int N = 51;
int cmpfunc (const void * a, const void * b){
   return ( *(int*)a - *(int*)b );
}

int main(){
    int n=0; long s=0;
    scanf("%d%ld", &n, &s);
    long arr[N] = {0};
    for(int i=0; i<n; ++i){
        scanf("%ld", &arr[i]);
    }
    qsort(&arr[0], n, sizeof(long), cmpfunc);
    long dist = arr[n-1] - arr[0];
    for(int right, left, i=0; i<n-1; ++i){
        left = MIN(arr[0]+s, arr[i+1]-s);
        right = MAX(arr[i]+s, arr[n-1]-s);
        dist = MIN(dist, right-left);
    }
    printf("%ld\n", dist);
    return 0;
}

C++14 解法, 执行用时: 2ms, 内存消耗: 384KB, 提交时间: 2019-08-17

#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;

const int N = 55;
int x[N];

int main() {
	//freopen("resources\\input.txt", "r", stdin);
	int n, s;
	scanf("%d%d", &n, &s);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &(x[i]));
	sort(x + 1, x + n + 1);
	
	int range = x[n] - x[1];
	for (int i = 1; i < n; ++i) {
		int min = INT_MAX;
		int max = INT_MIN;
		for (int j = 1; j <= i; ++j) {
			min = (x[j] + s < min) ? x[j] + s : min;
			max = (x[j] + s > max) ? x[j] + s : max;
		}
		for (int k = i + 1; k <= n; ++k) {
			max = (x[k] - s > max) ? x[k] - s : max;
			min = (x[k] - s < min) ? x[k] - s : min;
		}

		range = (max - min < range) ? max - min : range;
	}
	printf("%d", range);
	return 0;
}

上一题