「日常训练」「小专题·USACO」 Barn Repair(1-4)

题意

之后补。

分析

这题同样也很精巧。我们不妨思考一下,如果只允许用一块木板,那么要购买多少距离?是整个的距离吗?不是,是从第一个到最后一个(哈哈哈哈哈哈哈)。但是,不包括第一个的“左边”和最后一个的“右边”。只允许用两块的时候发生了什么变化?可以想见,最好的解是将最宽的那个间隔去掉。以此类推。
以这样的思路就可以得到题目的解法。问题在于各种各样的细节(again):样例数据里面给的牛棚按照顺序但是实际数据它未作保证;然后牛棚的距离记得-1,因为牛棚本身需要盖木板(也就是说,当木板限制大于牛数目时,最右解是每个牛棚盖长度为1的木板,也就是n)……
这是典型的贪心思想。

代码

/*
ID: samhx1
LANG: C++14
TASK: barn1
*/
#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (ll i = (a); i <= (b); ++i)
#define per(i, a, b) for (ll i = (a); i >= (b); --i)
#define QUICKIO                  
    ios::sync_with_stdio(false); 
    cin.tie(0);                  
    cout.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pi = pair<ll,ll>;

int main()
{
    freopen("barn1.in","r",stdin);
    freopen("barn1.out","w",stdout);

    int stall[205];
    int m,s,c;
    cin>>m>>s>>c;
    if(m>=c) { cout<<c<<endl; return 0; }
    rep(i,1,c)
        cin>>stall[i];
    sort(stall+1,stall+c+1);

    stall[0]=0;
    int delta[205];
    rep(i,1,c)
        delta[i]=stall[i]-stall[i-1]-1;
    sort(delta+2,delta+c+1);

    int ans=0;
    rep(i,0,m-2)
        ans+=delta[c-i];
    cout<<s-ans-(stall[1]-1)-(s-stall[c])<<endl;

    return 0;
}
如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
原文地址:https://www.cnblogs.com/samhx/p/9652060.html