usaco Barn Repair

这一题虽说水,可以开始自己居然没想到如何做。

题意:牛棚的门坏了,你得修,所有棚排成一排,用固定数量的板子把有牛住的棚(每一块板子可以无限长),求被板子封住的门的最少数量。给你板子最多数m,牛棚的总数s,牛的数量c,和牛住的棚的编号。

这是贪心专题,所以这一题只需要选择空余的房间数量就好了,

求出牛住的最小编号Min,最大编号Max,那么只需要在Min -- > Max之间剔除最大连续空房间的板子。每剔除依次,板子的数量加一。

/**
TASK: barn1
ID: DickensTone
LANG: C++
**/
#include<cstdio>
#include<fstream>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 200 + 5;
bool vis[maxn];
int open[maxn];
bool cmp(int x, int y)
{
    return x > y;
}
int num[maxn];
int main()
{
    freopen("barn1.in", "r", stdin);
    freopen("barn1.out", "w", stdout);
    int m, s, c;
    while(scanf("%d%d%d", &m, &s, &c) == 3)
    {
        int Min = maxn, Max = 0;
        memset(vis, 0, sizeof(vis));
        for(int i = 0; i < c; i++)
        {
            int t;
            scanf("%d", &t);
            vis[t] = 1;
            Min = min(Min, t);
            Max = max(Max, t);
        }
        //printf("%d %d\n", Max, Min);
        int cnt = 0;
        for(int i = Min; i <= Max; i++)
        {
            if(!vis[i])
                open[cnt]++;
            else if(open[cnt]) cnt++;
        }
        int ans = 0;
        sort(open, open + cnt, cmp);
        //for(int i = 0; i < cnt; i++)
            //printf("%d\n", open[i]);
        for(int i = 0; i < m - 1; i++)
        {
            ans = ans + open[i];
        }
        printf("%d\n", Max - Min - ans + 1);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值