USACO Barn Repair

        简单的贪心策略,想想在生活中让你去挡拿板子去当牛棚的话,你肯定不会去挡空隙太大,也就是根本没有牛在牛棚里的牛舍,那么这样以来再分析一下,如果你可以买M块板子,那么肯定是使用尽量多的板子,因为多用板子不会比少用的情况差可能会更好,因为这样避免了浪费(挡了一些空的牛舍)。那么这样思路就明显了,要用M块板子去挡牛棚,要求板子的总长度和尽量小,那么就是尽量不要去挡空隙太大的,也就是找出空闲牛棚间隙最大的前m-1个,减掉他们的长度便可以得到答案。忘了有个坑的地方是,如果M》C的话完全可以用一个办挡住一个牛棚位置,所以此时答案直接输出C,上面的策略就行不通了,做一下特判就好了。


/*
ID: ljracm1
LANG: C++
PROB: barn1
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#define T

using namespace std;

struct Item{
    int l,r,dis;
};

bool cmp(Item A,Item B){
    return A.dis>B.dis;
}

int main(){
    #ifdef  T
    freopen("barn1.in","r",stdin);
    freopen("barn1.out","w",stdout);
    #endif
    int m,c,s;
    while(cin>>m>>s>>c){
        int *stall = new int[c+5];
        for(int i=0; i<c; i++)
            cin>>stall[i];
        sort(stall,stall+c);
        if(m>=c){
            cout<<c<<endl;
            continue;
        }
        Item *tem = new Item[c+2];
        for(int i=0; i<c-1; i++){
            tem[i].l=stall[i];
            tem[i].r=stall[i+1];
            tem[i].dis=tem[i].r-tem[i].l+1;
        }
        sort(tem,tem+c-1,cmp);
        int ans = stall[c-1]-stall[0]+1;
        for(int i=0; i<m-1; i++)
              ans -= tem[i].dis-2;
        cout<<ans<<endl;

        delete []stall;
        delete []tem;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值