49 修理牛棚

问题描述 :

在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假,所以牛棚(牛棚的总数S:1<= S<=200)没有住满。 剩下的牛一个紧挨着另一个被排成一行安置在有屋顶的牛棚来过夜。 所以有些牛棚里有牛,有些没有。

所有的牛棚有相同的宽度,且宽度设为1。 因为有些门遗失,农民约翰需要架起新的木板作为门。 他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。 农民约翰想将他购买的木板总长度减到最少。

 

计算拦住所有有牛的牛棚所需木板的最小总长度。

输出所需木板的最小总长度作为的答案。

 

说明:拦住一个牛棚需要的木板长度为1,拦住相邻的三个牛棚则需要木板长度为3。

比如有牛的牛棚编号为:

3 5 8 10 11

并且只能使用两块木板,

则第一块木板从3到5,长度为3,

第二块木板从8到11,长度为4,

因此,需要木板的总长度为7。

 

 

输入说明 :

第 1 行: M 和 C(用空格分开)

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

 

其中:

可能买到的木板最大的数目:M(1<= M<=50);

需要安置的牛的数目C(1<= C <=S)

安置后牛所在的牛棚的编号stall_number(1<= stall_number <= S)

 

输出说明 :

单独的一行包含一个整数表示所需木板的最小总长度

输入范例 :

3 5
 2
 4
 6
 8
 7

输出范例 :

5

 

思想:这题的实质是计算间隔然后排序,先计算出所有的间隔数目,然后按大小排序,用牛棚头尾长度,减去间隔大的(不补这部分),就得到了需要求的长度.

 

复制代码
#include <stdio.h>

int sort(int *num, int n)
{
    int i, j, temp;
    for (i = 1; i <=n; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (num[i] > num[j])
            {
                temp = num[i];
                num[i] = num[j];
                num[j] = temp;
            }
        }
    }
}

int main()
{

    int m, c;
    int i = 0, j = 0, k = 0;
    int cowgap[200]={0};
    int cow[200]={0};
    while (scanf("%d %d", &m, &c) != EOF)
    {
        int door = 0;
        int sum = 0;
        for (i = 1; i <= c; i++)
        {
            scanf("%d", &cow[i]);
        }
        sort(cow, c+1);
        for (i = 1; i <= c; i++)
        {
            cowgap[i] = cow[i + 1] - cow[i] - 1;
        }
        sort(cowgap, c);

        for (i = 1; i < m; i++)
        {
            door += cowgap[c - i];
        }
        sum = cow[c] - cow[1] - door + 1;  //单个的门是修补长度是1
        printf("%d\n", sum);
    }
    return 0;
}
复制代码

 

 
posted @   梦想是能睡八小时的猪  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示