#include<iostream> using namespace std; //将打水时间从小到大排序 void maopao(int a[],int n){ bool ok; //进行N-1轮排序 for(int i=n-1;i>=1;i--){ ok=true;//假设没有交换 //每轮进行i次排序 for(int j=0;j<i;j++){ //大的数往下沉 if(a[j]>a[j+1]){ //相互交换 C++自带函数 swap(a[j],a[j+1]); ok=false;//一旦发生过交换,标志设置成false,说明需要下一轮 } } //如果此轮没有发生过交换,说明数组已经排序完成 //无需下一轮比较跳出循环 if(ok==true) break; } } int main(){ int n;//打水的人数 int r;//水龙头的个数 int a[510];//每个人的打水时间 int b[510];//每个人真正打水的时间= 打水时间+等待时间 cin>>n>>r; int sum=0;//所有人所用打水时间 //输入每个人的打水时间 for(int i=0;i<n;i++){ cin>>a[i]; } //对打水时间进行由小到大排序 maopao(a,n); //实体水龙头r个,前r个人无需等待,直接保存前r个人的打水时间 for(int i = 0; i < r; i++) { b[i] = a[i]; } //虚拟水龙头n-r个, 等于其等待时间,i - r 相当于从第1个水龙头顺序排下来 for(int i = r; i < n; i++) { b[i] = b[i - r] + a[i]; } //统计所有人打水时间 for(int i = 0; i < n; i++) { sum += b[i]; } cout<<sum<<endl; } /************************************************************** Problem: 1228 User: admin Language: C++ Result: Accepted Time:9 ms Memory:2072 kb ****************************************************************/