zoukankan      html  css  js  c++  java
  • ZOJ 3941 Kpop Music Party

    先把能合并的区间都合并起来。

    考虑最裸的贪心策略,从左到右一段一段的取。

    但是,这样会有错,错在没有考虑每段区间选取最后一个点。

    因为N只有10,所以枚举一下哪些区间最后一个点会被选择,然后按照最裸的的贪心策略从左到右选择即可,每次更新最大值。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include<algorithm>
    using namespace std;
    
    const int maxn=15;
    struct X
    {
        long long L,R;
    } s[maxn],tmp[maxn];
    int n;
    long long k,m,ans;
    int g[maxn];
    
    bool cmp(const X&a,const X&b)
    {
        if(a.L==b.L) return a.R<b.R;
        return a.L<b.L;
    }
    
    void f()
    {
        sort(tmp+1,tmp+1+n,cmp);
        int cnt=1;
        s[1].L=tmp[1].L,s[1].R=tmp[1].R;
        for(int i=2; i<=n; i++)
        {
            if(tmp[i].L<=s[cnt].R+1)
                s[cnt].R=max(s[cnt].R,tmp[i].R);
            else
            {
                cnt++;
                s[cnt].L=tmp[i].L,s[cnt].R=tmp[i].R;
            }
        }
        n=cnt;
    }
    
    long long check()
    {
        long long sum=0,pos=0; long long sy=m;
    
        for(int i=1;i<=n;i++)
        {
            if(pos<s[i].L)
            {
                long long u=min(sy,(s[i].R-s[i].L+1)/k);
                sum=sum+u*k,pos=s[i].L-1+u*k;
                sy=sy-u; if(sy==0) return sum;
    
                if(pos<s[i].R)
                {
                    sum=sum+k,pos=pos+k;
                    sy=sy-1; if(sy==0) return sum;
                }
    
                if(g[i]==1)
                {
                    sum=sum+s[i].R+k-1-pos;
                    pos=s[i].R+k-1;
                    sy=sy-1; if(sy==0) return sum;
                }
            }
            else if(pos>=s[i].R)
            {
                if(g[i]==1)
                {
                    sum=sum+s[i].R+k-1-pos;
                    pos=s[i].R+k-1;
                    sy=sy-1; if(sy==0) return sum;
                }
            }
            else
            {
                long long u=min(sy,(s[i].R-pos)/k);
                sum=sum+u*k,pos=pos+u*k;
                sy=sy-u; if(sy==0) return sum;
    
                if(pos<s[i].R)
                {
                    sum=sum+k,pos=pos+k;
                    sy=sy-1; if(sy==0) return sum;
                }
    
                if(g[i]==1)
                {
                    sum=sum+s[i].R+k-1-pos;
                    pos=s[i].R+k-1;
                    sy=sy-1; if(sy==0) return sum;
                }
            }
        }
        return sum;
    }
    
    void dfs(int tot)
    {
        if(tot==n+1)
        {
            ans=max(ans,check());
            return;
        }
        g[tot]=0; dfs(tot+1);
        g[tot]=1; dfs(tot+1);
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            ans=0;
            scanf("%d%lld%lld",&n,&k,&m);
            for(int i=1; i<=n; i++)
                scanf("%lld%lld",&tmp[i].L,&tmp[i].R);
            f();
            dfs(1);
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    我该不该学习C语言
    Java入门系列-27-反射
    Java入门系列-26-JDBC
    Java入门系列-25-NIO(实现非阻塞网络通信)
    Java入门系列-24-实现网络通信
    Java入门系列-23-NIO(使用缓冲区和通道对文件操作)
    Java入门系列-22-IO流
    Java入门系列-21-多线程
    Java入门系列-20-异常
    Java入门系列-19-泛型集合
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5430084.html
Copyright © 2011-2022 走看看