USACO Barn Repair

//类型,贪心 此题思路:用一个数组储存牛棚有牛的编号,再用一个数组储存每个相邻的牛之间的距离.然后每次的最短距离便是减去最长的相邻牛之间的距离.

/*
ID: jun41821
PROG: barn1
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ofstream fout ("barn1.out");
ifstream fin ("barn1.in");
void find()
{

}
int main()
{
    //类型,贪心;
    //由于当3块木板中最长的一块被切开  则得出4块木板的答案
 int m,s,c,i,*p,*a,num=0,j;
fin>>m>>s>>c;
p=new int[c+1];
a=new int[c+1];
for(i=1;i<=c;i++)
   fin>>p[i];
for(i=1;i<=c;i++)
   for(j=1;j<=c-i;j++)
    if(p[j]>p[j+1])
    {
     int t;
     t=p[j];
     p[j]=p[j+1];
     p[j+1]=t;
    }
a[1]=p[1]-1;
for(i=2;i<=c;i++)
{
   a[i]=p[i]-p[i-1];
}
if(m<c)
{
while(m>1)
{
   int max=0,t;
   for(i=2;i<=c;i++)
    if(a[i]>max)
    {
     t=i;
     max=a[i];
    }
    num+=max-1;
    a[t]=0;
    m--;
}
num=s-(num+a[1]+s-p[c]);
fout<<num<<endl;
}
else
   fout<<c<<endl;
return 0;
}

原文地址:https://www.cnblogs.com/amourjun/p/5134206.html