P2094 运输

https://www.luogu.com.cn/problem/P2094
涉及知识点:贪心,排序
黄色题
 
思路:
贪心策略:

首先贪心策略是每次选当前最大的两个数合并,直到只剩最后一件物品。

我看写题解的人都没写为什么这样的贪心是正确的,那我就来一发证明吧。

我们发现越先选的数被kk除的次数也就越多,为了使结果尽可能小,肯定是让越大的数除kk的次数越多越好,自此,贪心策略证明完毕。

(每除完都要进行一次排序,保证最大)


 

 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int comp(const int&a,const int&b)
{
    return a>b;//定义从大到小排序的函数
}
void add(int x[],int y,int n);
int main()
{
    int n,k,j,l;
    scanf("%d%d",&n,&k);
    int a[10001];
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a+0,a+n,comp);//从大到小排序
    for(int i=1;i<n;i++)
    {
        a[i]=(a[i-1]+a[i])/k;//每次将最大的两项进行处理
        a[i-1]=0;//倒数第二项清零
        j=i+1;
        l=i;
        while(a[j]>a[l]&&j<n)//将未清零的数进行一遍冒泡排序
        {
            int b=a[j];
            a[j]=a[l];
            a[l]=b;//交换值
            j++;
            l++;//冒泡排序的两项往后推一位
        }
    }
    printf("%d",a[n-1]);//a数组最后一项即为结果
    return 0;

 

posted @ 2022-07-15 16:05  -イレイナ  阅读(70)  评论(0)    收藏  举报