USACO-Section1.4 Barn Repair (贪心算法)
生活随笔
收集整理的這篇文章主要介紹了
USACO-Section1.4 Barn Repair (贪心算法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2017-5-27
題目描述
給定板的數目,用這么多塊板把牛棚蓋上使得板的總長最小解答
先把牛所在牛棚號排序,然后按照每兩個牛棚之間的距離排序, 間隔過大的牛棚不搭木板即可代碼
/* ID: 18795871 PROG: barn1 LANG: C++ */ #include<iostream> #include<cstdlib> #include<fstream> #include<algorithm> using namespace std;const int N = 200; int x[N+1];ifstream fin("barn1.in"); ofstream fout("barn1.out");struct cj{int s,e,c; }y[N+1];int cmp(const void *a,const void *b){struct cj *k1=(struct cj *)a;struct cj *k2=(struct cj *)b;if (k1->c==k2->c) return k2->s-k1->s;return k2->c-k1->c; }int main() {int i,m,n,c;fin>>m>>n>>c;int ma=1,mi=200;for (i=1;i<=c;i++){fin>>x[i];ma=max(ma,x[i]);mi=min(mi,x[i]);} sort(x+1,x+c+1);for (i=1;i<c;i++){y[i].s=x[i];y[i].e=x[i+1];y[i].c=x[i+1]-x[i];}qsort(y+1,c-1,sizeof(y[0]),cmp);int sum=0;int l=min(m,c);//注意不一定要前m個大的(若m>c)for (i=1;i<l;i++){sum+=y[i].c-1;}int r=ma-mi+1-sum;fout<<r<<endl;return 0; }直接使用貪心算法,如果說我們沒有限制木棒的根數,那么我們應該把每一個棚子都加一根木棒,這樣會使使用的木棒的總長度最小,但是,我們的根數是有限制的,這就意味著我們的木棒可能會覆蓋到沒有奶牛的棚子上面去,那么我們應該將所有的M根木棒全部用上,才會使總長度最小,那么就等同于我們要用M根木棒覆蓋所有的奶牛,那么就相當于在S長的線段上放置M個區間,保證區間長度和最小,并且能夠覆蓋到所有指定的地方。
那么我們剩下來的呢,剩下的M-1個區間之和應該是越大越好,(頭和尾巴一定是有奶牛的),那么我們就可以使用貪心了,區間總長度-剩下M-1區間之和就是我們要求的結果。我們將區間長度進行排序,選取最大的M-1個區間不要放置木棍即可。
總結
以上是生活随笔為你收集整理的USACO-Section1.4 Barn Repair (贪心算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++虚函数的作用是什么?
- 下一篇: USACO-Section2.1 Ord