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