CodeForces#196Div.2-A. Puzzles

题意:

在m个数里面选n个数,是的这n个数的最大值和最小值的差值尽可能的小。



反省:

我一开始的想法是,先求出m个数的平均值,将每个数与平均值的差值的绝对值存进数组里,由小到大排序,然后输出第n项和第1项的和。但是wrong在pretest 3上面了。

test 3:

Test: # 3, time:  0 ms., memory:  0 KB, exit code:  0, checker exit code:  1, verdict:  WRONG_ANSWER
Checker Log
wrong answer expected '0', found '7'

显然,在test 3中,最后2项应该选择12和12,输出0.


我的WA代码:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main() {
    int n,m,a[55],i,sum;
    while(scanf("%d%d",&n,&m)!=EOF) {
        sum = 0;
        for(i=0; i<m; i++){
            scanf("%d",&a[i]);
            sum += a[i];
        }
        int ave = sum/m;
        for(i=0; i<m; i++) {
            a[i] = fabs(a[i]-ave);
        }
        sort(a, a+m);
        printf("%d\n", a[0]+a[n-1]);
    }
    return 0;
}



后来我想到了这种可能性,所以改成在每两项之间判断取最小。


AC代码:

#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;

int i,n,m,a[60],ans;

int main() {
    scanf("%d%d",&n,&m);
    for(i=1; i<=m; i++)
        scanf("%d",&a[i]);
    sort(a+1,a+m+1);
    ans = (int)1e9;
    for(i=1; i<=m-n+1; i++)
        ans=min(ans,a[i+n-1]-a[i]);
    printf("%d\n",ans);
    return 0;
}




你可能感兴趣的:(CodeForces#196Div.2-A. Puzzles)