• USACO sec1.3 Barn Repair


    题意比较难懂。

    有编号为 1 2 3。。。S 的牛棚,其中C个有牛而其余的没有,现在所有牛棚护栏都被大雨淋坏了,而提供牛棚护栏的商人只能提供一定数目(M个)的护栏(长度则随意,想要多长就能提供多长),为了节省money,FJ决定在所有有牛的棚子都修好的前提下,尽可能使得所需护栏的总长度最小(或者被护栏围住的牛棚总数最少)。

    首先如果S<=M,完全可以只要S个就行了,是满足要求且最少的;

    如果S>M,就需要把一些不连续的含牛的牛棚用一个大的护栏围住,其中包含不含牛的牛棚,要使这些不含牛的被围牛棚总的数目最少,就尽量使同一个护栏下不连续的片段尽可能小,就有了贪心的思路。

    太绕口了。

    /*
        PROG : barn1
        LANG : C++
    */
    
    # include <cstdio>
    # include <cstdlib>
    # include <cstring>
    
    int M, C, S, b[205];
    char a[205];
    
    int cmp(const void *x, const void *y)
    {
        return *(int*)x > *(int*)y ? -1 : 1;
    }
    
    int main()
    {
        freopen("barn1.in", "r", stdin);
        freopen("barn1.out", "w", stdout);
        
        int i, j, x, cnt, ans = 0, k;
        scanf("%d%d%d", &M, &S, &C);
        memset(a, 0, sizeof(a));
        for (i = 0; i < C; ++i) scanf("%d", &x), a[x] = 1;
        k = 0;
        i = 1;
        while (!a[i]) ++i; ans += i-1;
        j = S;
        while (!a[j]) --j; ans += S-j;
        for ( ; i <= j; ++i)
        {
            cnt = 0;
            while (i <= j && !a[i]) ++i, ++cnt;
            if (cnt) b[k++] = cnt;
        }
        if (k < M-1)
            printf("%d\n", C);
        else
        {
            qsort(b, k, sizeof(int), cmp);
            for (i = 0; i < M-1; ++i) ans += b[i];
            printf("%d\n", S-ans);
         }
    
         fclose(stdin);
         fclose(stdout);
          
        
        return 0;
    }
  • 相关阅读:
    远离热闹
    漫步泰晤士小镇
    逛2011上海宠物大会(多图)
    iphone 4入手一周使用心得与感受
    章鱼帝
    南非世界杯赛程表下载(Excel版)
    相亲记
    再评富士康悲剧
    上海的朋友出门注意
    有感于车船税
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2643148.html
Copyright © 2020-2023  润新知