1. 程式人生 > >p1209 Barn Repair

p1209 Barn Repair

用優先佇列存放不連續的斷點及斷的位置。優先取間距大的,在斷點斷開。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include 
<stack> #define mkp make_pair using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=1050,INF=0x7FFFFFFF; lon arr[SZ],cut[SZ]; struct nd{ int a,b; nd(int x,int y):a(x),b(y){} bool operator<(const nd &rbs)const { return a<rbs.a; } };
int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { lon k,tot,n; cin>>k>>tot>>n; priority_queue<nd> pq; for(int i=1;i<=n;++i) { cin
>>arr[i]; } sort(arr+1,arr+1+n); for(int i=1;i<=n;++i) { if(i!=1&&arr[i]-arr[i-1]>1) { pq.push(nd(arr[i]-arr[i-1],i)); } } for(;k!=1;) { if(pq.empty())--k; else { nd pos=pq.top(); pq.pop(); //cout<<"pos.a: "<<pos.a<<endl; cut[pos.b]=1; --k; } } int bg=1; int res=0; for(int i=2;i<=n;++i) { if(cut[i]) { //cout<<"i: "<<i<<endl; res+=arr[i-1]-arr[bg]+1; //cout<<(arr[i-1]-arr[bg]+1)<<endl; bg=i; } } res+=arr[n]-arr[bg]+1; cout<<res<<endl; } return 0; }