a.链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01/00000000000698d6
题意:有n个学生,要从里面选出p个来。每一个学生都有一个能力值。
要求你选出来的一组学生能力是相同的,有的学生能力比较低,所以需要花费你的时间来提升学生能力,一个学生提升1个能力值需要1小时。
求最低花费。
方法:因为只能提高学生的能力值,不能降低,所以一定是选择能力值挨着的那些。将数组排序,然后计算前p个花费,再将窗口往后移动...分别计算。
#include <iostream> #include <climits> #include <algorithm> #include <vector> using namespace std; static auto x = [](){ std::ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); }; int main(){ int t,n,p; cin>>t; int tmp=0; int ii=0; while(ii<t){ cin>>n>>p; vector<int> si; for(int i=0;i<n;i++){ cin>>tmp; si.push_back(tmp); } if(p==1){ cout<<"Case #"<<++ii<<": "<<0<<endl; continue; } sort(si.begin(),si.end()); int last=0; int minn=INT_MAX; for(int i=0;(i+p-1)<n;i++){ if(i==0){ for(int j=0;j<p;j++){ last += si[p-1]-si[j]; } }else{ last-=si[i+p-2]-si[i-1]; last+=(si[i+p-1]-si[i+p-2])*(p-1); } minn=min(minn,last); } cout<<"Case #"<<++ii<<": "<<minn<<endl; } return 0; }