p1209 Barn Repair
阿新 • • 發佈:2018-11-10
用優先佇列存放不連續的斷點及斷的位置。優先取間距大的,在斷點斷開。
#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; }