运输(贪心)
#include<iostream> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int w[10010]; int main() { int n,k; cin>>n>>k; for(int i=1;i<=n;i++) { cin>>w[i]; } sort(w+1,w+n+1,cmp); int sum=0; int j=0; for(int i=1;i<=n-1;i++) { sum=(w[i]+w[i+1])/k; j=i+1; while(sum<w[j+1]) { if(j==n) { break; } w[j]=w[j+1]; j++; } w[j]=sum; } cout<<w[n]; return 0; } //5 2 //1 2 3 4 5
每次选当前最大的两个数合并,直到只剩最后一件物品
(越先选的数被kk除的次数也就越多,为了使结果尽可能小,肯定是让越大的数除kk的次数越多越好)