您的位置:首页 > 大数据 > 人工智能

USACO 1.3.2 Barn Repair 题解

2012-03-25 19:56 316 查看

【算法】贪心  【难度】★☆☆☆☆

考查贪心和排序。按题意需要找所需木板的最小总长度,若不考虑木板数目的限制,理论上的最短木板就是把所有有牛的牛棚都盖住。所以贪心算法很明显了。由于木板总数有限,所以在盖住所有有牛的牛棚后,找出连续牛棚之间的空隙,将最短空隙连起来,并重复这一过程,直到木板总数达到要求。

View Code

/*
ID: wsc5001
LANG: C
TASK: barn1
*/
#include <stdio.h>
#include <stdlib.h>
int b[200][4]={0},a[201]={0};
void quicksort0 (int f,int r)
{
int i,j;
int t0;
i=f;
j=r;
t0=a[i];
while (i<j)
{
while (i<j&&a[j]>t0){j--;}
if(i<j)
{
a[i]=a[j];
i++;
}
while (i<j&&a[i]<t0){i++;}
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=t0;
if (i-1>f)
quicksort0(f,i-1);
if (j+1<r)
quicksort0(j+1,r);
}
void quicksort1 (int f,int r)
{
int i,j;
int t0,t1,t2;
i=f;
j=r;
t0=b[i][0];
t1=b[i][1];
t2=b[i][2];
while (i<j)
{
while (i<j&&b[j][2]>t2){j--;}
if(i<j)
{
b[i][0]=b[j][0];
b[i][1]=b[j][1];
b[i][2]=b[j][2];
i++;
}
while (i<j&&b[i][2]<t2){i++;}
if(i<j)
{
b[j][0]=b[i][0];
b[j][1]=b[i][1];
b[j][2]=b[i][2];
j--;
}
}
b[i][0]=t0;
b[i][1]=t1;
b[i][2]=t2;
if (i-1>f)
quicksort1(f,i-1);
if (j+1<r)
quicksort1(j+1,r);
}
void quicksort2 (int f,int r)
{
int i,j;
int t0,t1,t2,t3;
i=f;
j=r;
t0=b[i][0];
t1=b[i][1];
t2=b[i][2];
t3=b[i][3];
while (i<j)
{
while (i<j&&b[j][0]>t0){j--;}
if(i<j)
{
b[i][0]=b[j][0];
b[i][1]=b[j][1];
b[i][2]=b[j][2];
b[i][3]=b[j][3];
i++;
}
while (i<j&&b[i][0]<t0){i++;}
if(i<j)
{
b[j][0]=b[i][0];
b[j][1]=b[i][1];
b[j][2]=b[i][2];
b[j][3]=b[i][3];
j--;
}
}
b[i][0]=t0;
b[i][1]=t1;
b[i][2]=t2;
b[i][3]=t3;
if (i-1>f)
quicksort2(f,i-1);
if (j+1<r)
quicksort2(j+1,r);
}
int zhao(int n,int t)
{
int i;
for (i=0;i<=t+1;i++)
if(b[i][3]==n)
return i;
}
int main()
{
FILE *fin,*fout;
fin=fopen("barn1.in","r");
fout=fopen("barn1.out","w");
int m,s,c,i,j,k,t,e;
fscanf(fin,"%d%d%d",&m,&s,&c);
for (i=0;i<c;i++)
{
fscanf(fin,"%d",&a[i]);
}
quicksort0(0,c-1);
b[0][0]=a[0];
t=0;
for (i=0;i<c;i++)
{
if (i+1<c&&(a[i+1]>(a[i]+1)))
{
b[t][2]=a[i+1]-a[i]-1;
b[t][1]=a[i];
b[t+1][0]=a[i+1];
t++;
}
}
b[t][1]=a[c-1];
b[t][2]=9999;
//printf("***%d***\n",t);
quicksort1(0,t-1);
for (i=0;i<=t;i++)
{
b[i][3]=i;
}
quicksort2(0,t-1);
if(t+1<=m)
k=c;
if (t+1>m)
{
k=c;
//printf("%d\n",k);
for (i=0;i<t+1-m;i++)
{
e=zhao(i,t);
k+=b[e][2];
}
}
fprintf(fout,"%d\n",k);
//system("pause");
fclose(fin);
fclose(fout);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: