「日常訓練」「小專題·USACO」 Barn Repair(1-4)

SamHX發表於2018-07-28

題意

之後補。

分析

這題同樣也很精巧。我們不妨思考一下,如果只允許用一塊木板,那麼要購買多少距離?是整個的距離嗎?不是,是從第一個到最後一個(哈哈哈哈哈哈哈)。但是,不包括第一個的“左邊”和最後一個的“右邊”。只允許用兩塊的時候發生了什麼變化?可以想見,最好的解是將最寬的那個間隔去掉。以此類推。
以這樣的思路就可以得到題目的解法。問題在於各種各樣的細節(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;
}

相關文章