问题描述:
新疆的某个矿场里新出了一批和田玉的籽料,大大小小共有n块,每一块和田玉都有各不相同的价值ai。 现需将这批和田玉籽料装入m只箱子中运到玉交易市场。
为了让这m只箱子的价值差之和最小,工人们对着n块玉按照价值大小依次排序,惊奇的发现这些玉每一块的价值与相邻的玉的差值竟然也各不相同。
箱子的价值差是指:箱子中一共有t块玉,每块玉的价值从大到小依次为A1,A2……,At,那么这只箱子的价值差值为:(A1-A2+A2-A3+……+At-1-At);如果箱子中只有1块玉,那么箱子的价值差就为0。
而m只箱子总体的价值差,就是各个箱子价值差的和。
现在要把这n块玉装入到m只箱子中了,尽量让编号小的玉放在编号小的箱子,请你替工人规划一下该如何装箱才能使得m只箱子的价值差最小。
输出时分别输出1号箱子到m号箱子内该装的玉,每只箱子中的玉按价值从小到大的顺序输出。
输入描述:
第1行两个整数n和m,分别表示玉的数量和箱子的数量;
第2行n个整数ai,分别表示每块玉的价值。
输出描述:
m行数,每行数字的开头是一个箱子的编号及冒号(英文输入下的冒号),后面若干个用1个空格隔开的整数,表示装入这个箱子的玉的价值
输入样例:
4 3
24 37 38 40
输出样例:
1:24
2:37 38
3:40
数据规模:
20%的数据:m=n<10;
60%的数据:m<=n<1000;
100%的数据:m<=n<20000,ai<=2∗109m<=n<20000,ai<=2∗109
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100000],k[100000],f[100000],hur;
struct node{
int x,y,c;
}b[100000];
int cmp(node x,node y)
{
return x.c>y.c;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i],k[i]=a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n-1;i++)
{
b[i].c=a[i+1]-a[i];
b[i].x=i;
b[i].y=a[i+1];
}
sort(b+1,b+n+1,cmp);
for(int i=1;i<=m;i++)
{
f[b[i].x]=1;
}
for(int i=1;i<=n;i++)
{
if(m&&f[i])
{
hur++;
cout<<hur<<":";
m--;
}
cout<<k[i]<<' ';
}
return 0;
}