USACO 1.3 Barn Repair(贪心)

这道题同样也是贪心

要使木板总长度最少,就要使未盖木板的长度最大。

我们先用一块木板盖住牛棚,然后,每次从盖住的范围内选一个最大的空隙,以空隙为界将木板分成两块,重复直到分成m块或没有空隙。

/*
  ID:twd30651
  PROG:barn1
  LANG:C++
*/
#include<iostream>
#include<fstream>
#include<stdlib.h>
//#define DEBUG
using namespace std;
int M;
int S;
int C;
int origin_data[300];
int process_data[300];
int comp(const void*a,const void*b)
{
    return*(int*)a-*(int*)b;
}
int comp2(const void*a,const void*b)
{
    return*(int*)b-*(int*)a;
}
int main(int argc,char *argv[])
{
    freopen("barn1.in","r",stdin);
    freopen("barn1.out","w",stdout);
    scanf("%d %d %d",&M,&S,&C);
    int i=0;
    int min=300;
    int max=0;
    while(scanf("%d",&origin_data[i])==1)
    {
        if(origin_data[i]>max)max=origin_data[i];
        if(origin_data[i]<min)min=origin_data[i];
        i++;
    }
    qsort(origin_data,i,sizeof(int),comp);
#if defined(DEBUG)
    for(int j=0;j<i;++j)
        printf("%d ",origin_data[j]);
    printf("\n");
#endif
    int j;
    for(j=1;j<i;++j){
        process_data[j-1]=origin_data[j]-origin_data[j-1]-1;
#if defined(DEBUG)
        printf("%d ",process_data[j-1]);
#endif
    }
    qsort(process_data,j-1,sizeof(int),comp2);

#if defined(DEBUG)
    printf("max is %d min is %d\n",max,min);
#endif
    int total=max-min+1;
    for(int i=0;i<M-1;++i){
#if defined(DEBUG)
        printf("process data %d\n",process_data[i]);
#endif
        total-=process_data[i];
    }
    printf("%d\n",total);

    return 0;
}
网上有说可以用dp,后面学习下

你可能感兴趣的:(USACO 1.3 Barn Repair(贪心))