贪心1--排队打水问题

贪心1--排队打水问题

一、心得

 

二、题目及分析

 

题目意思:有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
分析:看题目意思,要使每个人平均等待时间最小,当然是接水时间小的排在前面了,因此解法如下。

1、读入n个人接水时间。

2、对等待时间A数组进行排序,序号数组B同时进行排序。这里数据n为20000,因此,必须用快排才行,同时要注意的是,排序的时候要注意等待时间是一样的时候,序号前的要排在前面,所以要用到双关健排序。

3、对每个接水时间T进行累加S即S:=s+a[i],就是下一个人的等待时间了。对每个等时间S进行累加ZS,ZS就总等待时间了。

三、代码及结果

代码中的n为100

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 int main(){
 6     int n,r;
 7     cin>>n>>r;
 8     int a[100];
 9     for(int i=1;i<=n;i++){
10         cin>>a[i];
11     }
12     sort(a+1,a+n+1);
13     
14     //水龙头
15     int tap[100];
16     memset(tap,0,sizeof(tap));
17     int j=1; 
18     int sum=0;
19     for(int i=1;i<=n;i++){
20         if(j==r+1) j=1;
21         tap[j]+=a[i];
22         sum+=tap[j];
23         j++;
24     }
25     cout<<sum<<endl;
26     return 0;
27 } 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值