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;