zoukankan      html  css  js  c++  java
  • 1.3.2 Barn Repair 修理牛棚

    Description

    在一个夜黑风高,下着暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假,所以牛棚没有住满。 剩下的牛一个紧挨着另一个被排成一行来过夜。 有些牛棚里有牛,有些没有。 所有的牛棚有相同的宽度。 自门遗失以后,农民约翰必须尽快在牛棚之前竖立起新的木板。 他的新木材供应商将会供应他任何他想要的长度,但是供应商只能提供有限数目的木板。 农民约翰想将他购买的木板总长度减到最少。 给出:可能买到的木板最大的数目M(1<= M<=50);牛棚的总数S(1<= S<=200); 牛棚里牛的总数C(1 <= C <=S);和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。 输出所需木板的最小总长度作为答案。

    Input

    1 行: M , S 和 C(用空格分开) 2 到 C+1行: 每行包含一个整数,表示牛所占的牛棚的编号。

    Output

    单独的一行包含一个整数表示所需木板的最小总长度。

    Sample Input

    4 50 18
    3 
    4 
    6 
    8 
    14
    15 
    16 
    17 
    21
    25 
    26 
    27 
    30 
    31 
    40 
    41 
    42 
    43

    Sample Output

    25

    题目分析:用到去重 计算差值   选最大的前M个  具体看代码

    代码错误 没有分析重复的情况

    #include <iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    ll cmp(ll p,ll q)
    {
        return p>q;
    }
    int main()
    {
        ll n,m,s,c,i,j,h,sum=0,a[1010]= {0},b[1010]= {0};
        ll flag[1010]= {0},flag1[1010]= {0};
        cin>>m>>s>>c;
        for(i=0; i<c; i++)
            cin>>a[i];
        for(i=0; i<c-1; i++)
        {
            b[i]=a[i+1]-a[i];
        }
    //    for(i=0; i<c; i++)
    //        cout<<b[i];
    //    puts("");
        sort(b,b+c-1,cmp);
        for(i=m-1; i<c; i++)
            b[i]=0;
        ll k=1;
    //    for(i=0; i<c; i++)
    //        cout<<b[i];
    //    puts("");
        for(i=0; i<c; i++)
        {
            for(j=0; j<c-1; j++)
            {
                flag[i]=k;
                if(a[i+1]-a[i]==b[j]&&flag1[j]==0)
                {
                    flag1[j]=1;
                    k++;
                    break;
                }
            }
        }
    //    for(i=0; i<c; i++)
    //        cout<<flag[i];
        k=0;
        for(i=1;i<c-1;i++)
        {
            if(flag[i]!=flag[i+1])
            {
                sum+=a[i]-a[k]+1;
                k=i+1;
            }
        }
        sum+=a[c-1]-a[k]+1;
        //puts("");
        cout<<sum<<endl;
        return 0;
    }
    

    AC 代码:

    #include <iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include <set>
    using namespace std;
    typedef long long ll;
    ll cmp(ll p,ll q)
    {
        return p>q;
    }
    int main()
    {
        ll n,m,s,cc,i,j,h,sum=0,a[1010]= {0},b[1010]= {0};
        ll c[1010]={0};
        set<ll>se;
        cin>>m>>s>>cc;
        for(i=0; i<cc; i++)
        {
            cin>>a[i];
            se.insert(a[i]);
        }
        set<ll>::iterator it;
        i=0;
        for(it=se.begin();it!=se.end();it++)
        {
            c[i++]=*it;
        }
        cc=i;
        for(i=0; i<cc-1; i++)
        {
            b[i]=c[i+1]-c[i]-1;
        }
        sort(b,b+cc-1,cmp);
        for(i=0;i<m-1;i++)
            sum+=(b[i]);
        cout<<c[cc-1]-c[0]+1-sum<<endl;
        return 0;
    }
    
  • 相关阅读:
    Enum 枚举值 (一) 获取描述信息
    sqlbulkcopy 批量更新 数据库
    linq partition by
    C#委托的介绍(delegate、Action、Func、predicate)ga
    安装Tomcat
    安装 oracle
    468 Validate IP Address 验证IP地址
    467 Unique Substrings in Wraparound String 封装字符串中的独特子字符串
    464 Can I Win 我能赢吗
    463 Island Perimeter 岛屿的周长
  • 原文地址:https://www.cnblogs.com/zcy19990813/p/9702701.html
Copyright © 2011-2022 走看看