USACO 1.3 Barn Repair(贪心)

本文介绍了一个使用贪心算法解决木板覆盖问题的方法。目标是最小化所用木板的总长度,通过每次选择最大空隙进行分割直至达到预定块数或无法继续分割为止。代码采用C++实现,并详细展示了从输入处理到贪心策略实施的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题同样也是贪心

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

我们先用一块木板盖住牛棚,然后,每次从盖住的范围内选一个最大的空隙,以空隙为界将木板分成两块,重复直到分成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,后面学习下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值