7-11 1.3.2 修理牛棚 (100分)

在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了. 好在许多牛正在度假,所以牛棚没有住 满. 剩下的牛一个紧挨着另一个被排成一行来过夜. 有些牛棚里有牛,有些没有. 所有的牛棚有相 同的宽度. 自门遗失以后,农民约翰很快在牛棚之前竖立起新的木板. 他的新木材供应者将会供应 他任何他想要的长度,但是供应者只能提供有限数目的木板. 农民约翰想将他购买的木板总长度减 到少. 给出 M(1<= M<=50),可能买到的木板的数目;S(1<= S<=200),牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号 stall_number(1 <= stall_number <= S),计算拦住 所有有牛的牛棚所需木板的最小总长度. 输出所需木板的最小总长度作为的答案.

输入格式:
第 1 行: M , S 和 C(用空格分开)

第 2 到 C+1 行: 每行包含一个整数,表示牛所占的牛棚的编号

输出格式:
单独的一行包含一个整数表示所需木板的小总长度.

输入样例1:(正常输入有牛的牛棚编号)
在这里给出一组输入。例如:

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

输出样例1:
在这里给出相应的输出。例如:

25

输入样例2:(乱序输入有牛的牛棚编号)

1 200 8
101
105
102
106
103
107
104
99

输出样例2:

9

输入样例3:(乱序输入有牛的牛棚编号,且 可买到的木板数目>牛棚里牛的数目 即 M>S)

50 200 10
18
69
195
38
73
28
6
172
53
99

输出样例3:

10


【思路】

1.针对乱序输入
我先利用vector容器储存有牛的牛棚编号,再利用sort对其进行从小到大的排序

2.针对求所需木板的最小总长度
可能存在以下情况:
(1)可买到的木板数目>牛棚里牛的数目 即 M>S (易忽略)
此情况较为简单,一头牛配一块板足矣,故所需木板的最小总长度为牛的数量;

(2)可买到的木板数目<=牛棚里牛的数目 即 M<=S
此情况最为常见,具体如下:
在这里插入图片描述


【源代码】

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int m, s, c;
    cin >> m >> s >> c;
    vector<int> Barn; // 记录有牛的牛棚;
    int j;
    for (int i = 0; i < c; i++)
    {
        cin >> j;
        Barn.push_back(j);
    }

    if (m < c) // Condition2;
    {
        sort(Barn.begin(), Barn.end()); // 对输入的牛棚编号排序;
        vector<int> Length(Barn.size() - 1); // 记录牛棚间的宽度;
        for (unsigned int i = 0; i < Length.size(); i++)
        {
            Length[i] = (Barn[i + 1] - Barn[i]);
        }
        sort(Length.begin(), Length.end()); // 对宽度进行排序,宽度大的排后;

        int sum = 0;
        for (unsigned int i = 0; i < (Length.size() - (m - 1)); i++) // 排除了最后(M-1)个大宽度后,求剩余的宽度之和;
        {
            sum += Length[i];
        }
        cout << (sum + m) << endl; // +m 是因为每块板的起点都应该算为1个宽度;
    }
    else if (m >= c) // Condition1;
    {
        cout << c << endl;
    }
    return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值