题目描述
快到年末了,Boss Liu准备在年会上发些礼物,由于不想礼物的价格区别太大,Boss Liu希望最好的礼物与最差的礼物价格相差越小越好。 当然,如果存在相同的选择,Boss Liu希望花的钱越少越好。
Boss Liu把这个买礼物的任务给你,你决定写个程序来帮助自己计算一下。
输入
第一行是一个整数K,表示样例的个数。
每个样例的第一行是一个整数n,m(1≤m≤n≤1000),分别表示可购买的礼物的个数和实际需要购买的个数。
每个样例的第二行是n个整数xi,i=1,2,⋯,n(1≤xi≤100),表示n个礼物的价格。
输出
每个样例输出两个整数,分别表示最小的价差以及总的花费,中间用一个空格隔开。
样例输入
2 5 3 10 5 9 7 2 5 1 10 5 9 7 2
样例输出
3 26 0 2 解题思路:首先将礼物的价格从小到大排序,然后枚举算出每 m 个相邻礼物的价差与总价,在价差相同的情况下,选择最小的总价即可。
#include<stdio.h>
void mppx(int n,int a[])//排序函数
{
int i,j,t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int a[1001];
int main()
{
int n,m,T,t,min,sum,sum1,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
mppx(n,a);
min=a[m-1]-a[0];
sum=0;
for(i=0;i<=m-1;i++)
{
sum+=a[i];
}
for(i=1;i<=n-m;i++)
{
sum1=0;
if(a[m-1+i]-a[i]==min)//相同选择的情况
{
for(j=i;j<=m-1+i;j++)
{
sum1+=a[j];
}
sum = sum1 > sum ? sum : sum1;
}
else if(a[m-1+i]-a[i]<min)
{
min=a[m-1+i]-a[i];
for(j=i;j<=m-1+i;j++)
{
sum1+=a[j];
}
sum=sum1;
}
}
printf("%d %d\n",min,sum);
}
return 0;
}