西电网络赛 - G
2019-04-14 22:05发布
生成海报
#include
#include
#include
using namespace std;
/****************************************************************************************************************
画外音(学神满早上说用贪心,然后想了一天没想出来,晚上打球回来 WC 的时候竟然想出来了)
题意:给定 n 个文件,每次最多合并 k 个文件,输出最小的文件总数
思路:
1,贪贪贪,数值大的文件合并次数尽可能少,尽量多合并数值小的文件。
2,每次合并完之后,将新合并的文件放入原文件堆,重新排序,再次处理
eg:
输入: 7 4
1 2 3 4 5 6 7 8 9 10 11
过程:
1 2 )3 4 5 )6 7 8 )9 10 11 <合并 1 2,花费 1+2=3>
3 3 4 5 )6 7 8 )9 10 11 <合并 3 3 4 5,花费 3+3+4+5=15>
6 7 8 9 )10 11 15 <合并 6 7 8 9,花费 6+7+8+9=30>
10 11 15 30 <合并 10 11 15 30,花费 10+11+15+30=66>
合并结束,总花费 3+15+30+66=114
****************************************************************************************************************/
int main()
{
int N,M;
long long a[2050];
while(cin>>N>>M)
{
memset(a,0,sizeof(a));
long long sum=0;
for(int i = 1;i <= N;i ++)
cin>>a[i];
sort(a+1,a+N+1);
if(N == 1)
cout<<"0"< 0){
mod=le;
while(mod > M)
mod=mod-(M-1);
long long flag=0;
for(int i = id;i mod)
le=le-mod+1;
else
le=0;
}
cout<
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮