【[USACO1.3]修理牛棚 Barn Repair】

这道题可以算是一道贪心的较好的题目
但是这道题有很多坑点
于是蒟蒻我就华丽的交了5、6次才AC

样例分析

3 4 6 8 14 15 16 17 25 26 27 30 31 40 41 42 43
1:43-3+1=41(这是假设只有一块木板时的情况)
3 4 6 8 14 15 16 17 25 26 27 30 31
40 41 42 43
2:31-3+1+43-40+1=33(删除掉相邻之间间隔最大的木板后的排序)
3 4 6 8 14 15 16 17
25 26 27 30 31
40 41 42 43
3:17-3+1+31-25+1+43-40+1=26(以此类推第三块)
3 4 6 8
14 15 16 17
25 26 27 30 31
40 41 42 43
4:8-3+1+17-14+1+31-25+1+43-40+1=21(第四块)

分析题目

1:这个题目给的数据不是有序的!!!
特判
2:如果只有一块木板,直接返回最开始的假设情况
3:如果木板数量超过牛的数量,那就直接输出牛的数量(一牛一块木板)

代码

“`cpp

include

include

include

include

include

using namespace std;

struct node {int x,y,z;}ob[205];

int f[205];

bool f1[205];

int s,m,c,ans=0;

inline int read()

{

int x=0;
char c=getchar();
bool flag=0;
while(c<'0'||c>'9'){if(c=='-')flag=1;   c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?-x:x;

}

bool cmp(node x,node y)

return x.z>y.z;

int main()
{

read(m),read(s),read(c);
memset(f1,0,sizeof(f1));
for(int i=1;i<=c;i++)
{
    read(f[i]);
    f1[f[i]]=1;
}

//f1是用来判断这个牛棚是不是空的,f是暂时储存读入的数

sort(f,f+c+1);
ans=f[c]-f[1]+1;//先假设为一块木板的情况,计算出最大长度
if(m==1)
{
    cout<<ans<<endl;
    return 0;
}
if(m>c)
{
    cout<<c<<endl;
    return 0;
}
ob[1].x=f[1];
ob[1].y=f[1];
ob[1].z=1;  
for(int i=2;i<=c;i++)
{
    ob[i].x=ob[i-1].y;//ob[i].x表示这个牛之前的一头的位置
    ob[i].y=f[i];//ob[i].y表示当前位置
    ob[i].z=ob[i].y-ob[i].x+1;//ob[i].z表示与之前一头牛的距离,
}
sort(ob,ob+c+1,cmp);    
for(int i=0;i<m-1;i++)
ans-=ob[i].z-2;//依次删去最大的间隔
cout<<ans;
return 0;

}
“`cpp

猜你喜欢

转载自blog.csdn.net/Shikita/article/details/81674566