/*
ID: cjn77881
LANG: C++
TASK: barn1
*/
#include <stdio.h>
int cow[200],dis[200],M,S,C;
void swap(int &a,int &b){
int c = a;
a = b;
b = c;
return;
}
void qSort(int *a,int h,int t){
if (h>=t) return;
int i=h,j=t,x=a[(h+t)>>1];
while (i<=j){
while (a[i]<x) i++;
while (a[j]>x) j--;
if (i<=j){
swap(a[i],a[j]);
i++;
j--;
}
}
qSort(a,h,j); //快排是 h至j再排序
qSort(a,i,t);
}
int main(){
FILE *fin = fopen("barn1.in","r");
FILE *fout = fopen("barn1.out","w");
fscanf(fin,"%d %d %d\n",&M,&S,&C);
M=M>C?C:M;//板子比牛多的话就一个牛一个板子
for (int i=0;i<C;i++) fscanf(fin,"%d\n",&cow[i]);
qSort(cow,0,C-1);
for (int i=0;i<C-1;i++) dis[i]=cow[i+1]-cow[i]-1;
qSort(dis,0,C-2); //排序两牛栏间的距离
int ans = S-1; //初始答案为1至S间的距离
for (int i=0;i<M-1;i++) ans-=dis[C-2-i]; //取出最大的M-1个距离剩下就是最省板的方法
ans=ans-cow[0]+1; //减掉1至第一头牛的距离
ans=ans-(S-cow[C-1]-1); //减掉S至最后一头牛的距离
printf("%d\n",ans);
fprintf(fout,"%d\n",ans);
//for (int i=0;i<C;i++) printf("%d\n",cow[i]);
return 0;
}
USACO 1.4.2_barn1
最新推荐文章于 2021-07-20 22:57:59 发布