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); }
相关文章推荐
- usaco 1.3.2 Barn Repair
- USACO 1.3.2 Barn Repair
- USACO1.3.2--Barn Repair
- usaco-1.3.2-Barn Repair(贪心算法)
- USACO 1.3.2 Barn Repair (barn1)
- USACO 1.3.2 Barn Repair
- [USACO 1.3.2] Barn Repair
- USACO1.3.2 Barn Repair(修理牛棚)
- USACO section1.3.2 Barn Repair
- USACO section1.3.2 Barn Repair
- 【USACO题库】1.3.2 Barn Repair修理牛棚
- USACO1.3.2 Barn Repair (barn1)
- USACO: 1.3.2 Barn Repair(barn1) 解析
- usaco wormhole(看了官方视频题解)
- USACO 1.3 Barn Repair (barn1)
- usaco 2002 月赛 Fiber Communications 题解
- usaco 2003 fall Cow Exhibition 奶牛展览会 题解
- 【USACO题库】2.3.2 Cow Pedigrees奶牛家谱 题解
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码
- BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解