USACO Barn Repair
这题做得真纠结,第五次才AC。 刚想起来其实排序可以优化一点点。。 输入数据不是有序的,要先排序!我的算法就是先铺上木板再去掉最大的那几个空隙。 前后改来改去,写得很乱。还要注意m很大的情况。
/*
ID: djgreen1
LANG: C
PROB: barn1
*/
#include <stdio.h>
int main()
{
int m,s,c,num[200],data[200],first,i,j,p=1,pnum=0,a,sum,gap,t;
FILE *in=fopen("barn1.in","r"),*out=fopen("barn1.out","w");
fscanf(in,"%d%d%d",&m;,&s;,&c;);
for(i=1;i<=c;i++) fscanf(in,"%d",&data;[i]);
//sort
for(i=1;i<c;i++)
for(j=1;j<c;j++) if (data[j]>data[j+1])
{
t=data[j+1];
data[j+1]=data[j];
data[j]=t;
}
first=data[1];
a=first;
for(i=2;i<=c;i++)
{
if (data[i]>i-p+first)
{
gap=data[i]-(i-p+first);
num[pnum]=gap;
pnum++;
first=data[i];
p=i;
}
}
//sort
for(i=pnum-1;i>0;i--)
for(j=pnum-1;j>0;j--) if (num[j]>num[j-1])
{
t=num[j-1];
num[j-1]=num[j];
num[j]=t;
}
sum=data[c]-a+1;
if (m>pnum+1) m=pnum+1;
for(i=0;i<m-1;i++) sum=sum-num[i];
fprintf(out,"%d\n",sum);
fclose(in);
fclose(out);
}
```
comments powered by Disqus