Description
快到年末了,Boss Liu准备在年会上发些礼物,由于不想礼物的价格区别太大,Boss Liu希望最好的礼物与最差的礼物价格相差越小越好。 当然,如果存在相同的选择,Boss Liu希望花的钱越少越好。
Boss Liu把这个买礼物的任务给你,你决定写个程序来帮助自己计算一下。
Input
第一行是一个整数K,表示样例的个数。
每个样例的第一行是一个整数n,m(1≤m≤n≤1000) ,分别表示可购买的礼物的个数和实际需要购买的个数。
每个样例的第二行是n个整数x i ,i=1,2,⋯,n(1≤x i ≤100) ,表示n个礼物的价格。
Output
每个样例输出两个整数,分别表示最小的价差以及总的花费,中间用一个空格隔开。
Sample Input
2
5 3
10 5 9 7 2
5 1
10 5 9 7 2
Sample Output
3 26
0 2
解题思路:
先将数组进行排序,排序后判断最下价差区间所在位置,用flag标记,再将区间内m个数相加,得到总的花费。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x[101];
int s[101];
int k,t,n,m;
int flag=0,cnt=0,sum=0;
cin>>k;
while(k--)
{
cin>>n>>m;
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
//升序排序
for(int i = 0; i < n-1; i++)
{
for(int j = 0; j < n-1-i; j++)
{
if(x[j] > x[j+1])
{
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
}
}
if(m == 1)
cout<<"0 "<<x[0]<<endl;
else
{
//将相隔m个位置的价差都记录在s数组里
for(int i=0; i <= n-m; i++)
s[cnt++]=x[i+m-1]-x[i];
int min=s[0];
for(int i=1; i<cnt; i++)
{
if(min == 0)
break;
if(s[i] < min)
{
min = s[i];
flag = i;//标记找到的最小价差位置
}
}
//计算最小价差区间内的累加和
for(int i=flag; i<=flag+m-1; i++)
sum += x[i];
cout<<min<<" "<<sum<<endl;
}
}
return 0;
}