[贪心算法] 助教写代码

描述

在程设班里,每个学生每分钟可以自己编写 a 行代码。现在班级里只有一位助教,他很厉害。助教每分钟可以额外帮助一个学生编写 b 行代码(也就是说,该学生每分钟可以编写 a+b 行代码),
但在同一时间内助教只能帮助一个学生。现在有 n 个学生,第 i 个学生需要编写的代码量为 wi 行,请你求出所有学生完成编写所有代码的最少时间(以一分钟为最小单位)。

输入

第一行三个整数,分别为 n, a, b。
接下来第 2 到第 n+1 行,第 i 行输入 wi。
1 ≤ wi, a, b, n ≤ 5 × 105

输出

一行,表示让所有学生完成编写代码的最少时间。

样例输入

3 2 1
1
2
3

样例输出

1

提示

样例解释
让助教帮助第三个学生即可在一分钟就完成。

另外,注意在计算过程中数据是否存在溢出的情况。

解题分析

这是一道很经典的贪心算法,我们首先去考虑如何达到助教帮学生写代码能够达到最快的速度。由于每分钟每个学生也会自己敲代码,所以实际上影响最终时间的是那个敲代码量最多的同学,所以只要助教每分钟去帮助敲代码量最多的同学即可(注意这个同学会发生改变,因为随着时间的进行,每分钟之后要敲最多代码的那个同学会发生改变)。

代码演示

#include <iostream>
#include <cstdio>
#include <queue>
#include <bitset>
#include <map>
#include <set>
#include <algorithm>
#include <cstdlib>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <vector>
#include <sstream>

using namespace std;
int n,a,b;
int w[500005];

bool check(){
	for(int i=1;i<=n;i++){
		if(w[i]>0) return false;
	}
	return true;
}

void help(){
	auto p=max_element(w+1,w+n+1);
	*p-=b;
	for(int i=1;i<=n;i++){
		if(w[i]>0)
		w[i]-=a;
	}
}

int main(){
	scanf("%d%d%d",&n,&a,&b);
	for(int i=1;i<=n;i++){
		scanf("%d",&w[i]);
	}
	int k=0;
	while(!check()){
		k++;
		help();
	}
	printf("%d\n",k);
    return 0;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 贪心算法是一种在每一步选择中总是选择当前最优解的策略来求解问题的算法。具体的代码实现要看具体的问题而定。 例如,在求解背包问题时,贪心算法代码实现可能长这样: ```python def greedy_knapsack(items, max_weight): """ items: list of (value, weight) tuples max_weight: int """ items.sort(key=lambda x: x[0]/x[1], reverse=True) total_value = 0 total_weight = 0 for value, weight in items: if total_weight + weight <= max_weight: total_value += value total_weight += weight else: remaining_weight = max_weight - total_weight total_value += value * remaining_weight / weight break return total_value ``` 这是一种贪心算法的典型实现,其中每次选择价值/重量最大的物品直到背包装不下为止。 还有很多其他问题可以用贪心算法来解决,例如贪心算法求最小生成树,贪心算法求解旅行商问题等等, 代码实现也是不一样的。 ### 回答2: 贪心算法是一种常用的求解最优化问题的算法。其求解代码主要分为以下几个步骤: 1. 确定问题的最优子结构:贪心算法的核心思想是每一步都选择当前最优的解决方案,而不考虑整体的最优解。因此,首先需要确定问题具有最优子结构的性质。这意味着问题的最优解可以通过一系列局部最优解的组合得到。 2. 设计贪心策略:通过观察问题的特点,确定每一步选择的策略。贪心策略应该能够保证局部最优解的选择,从而达到全局最优解。 3. 编贪心算法的实现代码:根据贪心策略,编实现贪心算法代码。通常,可以使用循环或递归的方式来实现贪心算法。在每一步中,根据贪心策略选择当前的最优解,并更新问题的状态。 4. 检查贪心算法的正确性:完成代码实现后,需要对算法进行验证。通过对比贪心算法的输出与问题的实际最优解,来检查算法的正确性。如果贪心算法能够给出问题的最优解,则验证通过。 需要注意的是,贪心算法并不适用于所有类型的问题。有些问题需要使用动态规划等其他方法来求解。此外,贪心算法给出的结果不一定是全局最优解,只能保证是一种局部最优解。因此,在使用贪心算法时,需要评估算法的适用性和解的质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值