修理牛棚(贪心)

82 篇文章 0 订阅
31 篇文章 0 订阅



description
 
这是一个月黑风高的晚上, 狂风把小韩的牛棚摧毁了. 但幸运的是,有些牛在休假,所以牛棚不是满的。
牛棚是一排的。 有的牛棚里有牛,有的没有。所有的牛棚都是相同的宽度(为一个单位)。
现在小韩要最快的修理牛棚的门,需要弄些木板来封住出口,以免牛跑出去。木材提供商可以提供给他各种宽度的木板, 但是数量有限。 小韩没多少钱,希望把购买木板的钱尽量省一点,也就是木板的总宽度最短。

 

input

你一行输入三个数M,S,C。M(1<=M<=50),代表最多可以购买的木板的数量。
S(1<=S<=200),牛棚的总数。C(1<=C<=S),代表现在还在牛棚的牛的数量。然后有C行,每行输入一个数Si,表示编号为Si的牛棚里有牛。

 

output

输出一个数T,为锁住当前牛棚里所有牛而花费的所有木板的总宽度。

 

sample_input

4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43

 

sample_output

25

 

hint

对于样例,我们可以得出最小宽度的4个木板,3-8,14-21,25-31,40-43,总计25的宽度

 
此题需要多思考,其实按照普通思路也应该能写出来,不过个人能力有限硬是wa到底。在网上见到某个这题的代码深受启发。其思路主要是将所有牛棚先搭上一个木板,再去掉区间。其中最重要的一点是区间并不需要去寻找具体是哪一个区间(刚开始思维受限于此总想着怎样去找具体的区间,可事实是根本不需要儿!)所以将所有区间大小一个排序就搞定儿!那么用最大木板减去该减掉的区间这题就搞定啦~!
下面附上代码:

#include <iostream> 

#include <algorithm> 

using namespace std; 

  

int w[250]; 

int o[250]; 

int z; 

  

int main() { 

    int m, s, c; 

    while (cin >> m >> s >> c) { 

        for (int i = 0; i < c; i++) 

            cin >> w[i]; 

     sort(w, w + c); 

        for (int i = 1; i < c; i++) 

            o[i] = w[i] - w[i - 1]; 

        sort(o + 1, o + c); 

        z = 0; 

        for (int i = 1; i < m && i < c; i++) 

            z += o[c - i] - 1; 

        int sum = w[c - 1] - w[0] + 1; 

        cout << sum - z << endl; 

    } 

    return 0; 

}
 

为了解决将奶牛放入牛棚这一类问题,并使用贪心策略来最大化最小值(即让最拥挤的那个牛棚中的奶牛数量尽可能少),我们可以按照如下步骤设计一个算法: 1. 首先对牛棚或奶牛的需求进行排序,使得我们能优先考虑需求最大的情况。 2. 使用一个数组或列表记录每个牛棚当前包含的奶牛数。 3. 迭代每一头奶牛,总是选择当前包含最少奶牛的牛棚放置新奶牛。 4. 重复上述过程直到所有奶牛都被分配到某个牛棚为止。 以下是基于以上逻辑的一个简化版伪代码示例,实际应用时需转换成具体编程语言实现(如Java): ```java import java.util.Arrays; public class BarnAssignment { public static void main(String[] args) { // 假设有N个牛棚和M头奶牛需要被分配 int N = 5; // 牛棚的数量 int M = 10; // 奶牛的数量 assignCowsToBarns(N, M); } private static void assignCowsToBarns(int barnCount, int cowCount) { // 初始化每个牛棚的奶牛数量 int[] barns = new int[barnCount]; // 将每头奶牛分配给目前奶牛最少的牛棚 for (int i = 0; i < cowCount; ++i) { // 找出当前奶牛最少的牛棚 int minIndex = findMinCowBarn(barns); // 在该牛棚增加一头奶牛 barns[minIndex]++; } // 输出结果 System.out.println("最终各个牛棚的奶牛分布:"); System.out.println(Arrays.toString(barns)); } private static int findMinCowBarn(int[] barns) { int minIndex = 0; for (int i = 1; i < barns.length; ++i) { if (barns[i] < barns[minIndex]) { minIndex = i; } } return minIndex; } } ``` 此段代码首先初始化了每个牛棚容纳的奶牛数目为零,然后遍历所有的奶牛并将它们逐一安排至当前含奶牛量最少的牛棚。通过这种方法,我们可以保证在分配过程中,任何两个牛棚之间的奶牛数差距不会变得过大,从而实现了贪心地最大化最小值的目标。请注意这个例子是用Java编写的,并且为了简单起见假设所有奶牛对于牛棚的选择没有偏好顺序。如果实际情况中有其他限制条件,则可能需要调整算法以满足这些要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值