zoukankan      html  css  js  c++  java
  • jzoj6367. 【NOIP2019模拟2019.9.25】工厂(factory)

    在这里插入图片描述
    在这里插入图片描述

    赛时

    ⑧说了,比赛因为T1搞自闭了。
    草草无脑状压了一下,滚粗。

    题解

    其实这题真的很简单。
    首先,题目会给出特别特别多的区间。
    那么必定有几个区间是不包含任何的区间的。(香蕉相交不算)
    我们把这些区间拎出来,变成一个集合a。
    而其他区间必定至少包含一个a集合中的区间。
    把这些区间变成另一个集合b。

    那么我们可以发现一些小性质——
    1、我们发现,可以先把a集合中的区间随便放进若干个流水线中,只需保证工作时间>0即可。
    2、其次,每个b集合中的区间要么放入它所包含的a区间的流水线中,不做贡献,要么独自一个放入一个新的集合中,产生自己的代价。

    于是我们可以分开来做了。
    首先我们设(f_{[i][j]})表示当前把前i个a集合中的区间放入j个流水线的最大价值。
    转移显然。(O(n^3))

    那么剩下的就可以随意加入b集合了。
    我们直接取出最大的几个b区间,即可。

    标程

    #include <iostream>
    #include <cstring>
    #include <cmath>
    #include <cstdio>
    #include <algorithm>
    #include <cctype>
    using namespace std;
    const int maxn=210;
    
    int n,m,ga,gb,ans;
    int x[maxn],y[maxn],ax[maxn],ay[maxn],bx[maxn],by[maxn];
    int f[maxn][maxn],sum[maxn];
    bool bz[maxn];
    
    void qsortb(int l,int r)
    {
    	int i=l;int j=r;
    	int m=by[(i+j)/2]-bx[(i+j)/2]+1;
    	while (i<=j)
    	{
    		while (by[i]-bx[i]+1>m) i++;
    		while (by[j]-bx[j]+1<m) j--;
    		if (i<=j)
    		{
    			swap(bx[i],bx[j]);
    			swap(by[i],by[j]);
    			i++;j--;
    		}
    	}
    	if (l<j) qsortb(l,j);
    	if (r>i) qsortb(i,r); 
    }
    
    void qsorta(int l,int r)
    {
    	int i=l;int j=r;
    	int m=ax[(i+j)/2];
    	int m1=ay[(i+j)/2];
    	while (i<=j)
    	{
    		while ((ax[i]<m) || (ax[i]==m && ay[i]<m1)) i++;
    		while ((ax[j]>m) || (ax[j]==m && ay[j]>m1)) j--;
    		if (i<=j)
    		{
    			swap(ax[i],ax[j]);
    			swap(ay[i],ay[j]);
    			i++;j--;
    		}
    	}
    	if (l<j) qsorta(l,j);
    	if (r>i) qsorta(i,r); 
    }
    
    int main()
    {
    	freopen("factory.in","r",stdin);
    	freopen("factory.out","w",stdout);
    	scanf("%d%d",&n,&m);	
    	for (int i=1;i<=n;i++)
    	{
    		scanf("%d%d",&x[i],&y[i]);y[i]--;
    	}
    	memset(bz,false,sizeof(bz));
    	for (int i=1;i<=n;i++)
    	{
    		bool pd=true;
    		for (int j=1;j<=n;j++)
    		{
    			if (j!=i)
    			{
    				if (!bz[j] && x[i]<=x[j] && y[j]<=y[i])
    				{
    					pd=false;
    					break;
    				}
    			}
    		}
    		if (pd==true)
    		{
    			ga++;
    			ax[ga]=x[i];
    			ay[ga]=y[i];
    		}
    		else
    		{
    			gb++;
    			bx[gb]=x[i];
    			by[gb]=y[i];
    			bz[i]=true;
    		}
    	}
    	qsorta(1,ga);
    	memset(f,128,sizeof(f));
    	f[0][0]=0;
    	for (int i=0;i<=ga;i++)
    	{
    		for (int k=0;k<=min(i,m);k++)
    		{
    			for (int j=i+1;j<=ga;j++)
    			{
    				if (f[i][k]>=0)
    				if (ay[i+1]-ax[j]+1>0)
    				{
    					f[j][k+1]=max(f[j][k+1],f[i][k]+ay[i+1]-ax[j]+1);
    				}
    			}
    		}
    	}
    	qsortb(1,gb);
    	for (int i=1;i<=n;i++)
    	{
    		sum[i]=sum[i-1]+by[i]-bx[i]+1;
    	}
    	for (int i=0;i<=m;i++)
    	{
    		ans=max(ans,f[ga][m-i]+sum[i]);
    	}
    	printf("%d
    ",ans);
    } 
    
  • 相关阅读:
    Error C1189: #error: Please use the /MD switch for _AFXDLL builds
    block,inline和inline-block概念和区别(转载)
    jQuery学习--Code Organization Concepts
    Kafka— —副本(均衡负载)
    Kafka实践1--Producer
    漫画HDFS工作原理(转)
    JavaScript学习笔记3
    搭建简单SBT工程实践
    Hive SQL测试
    SparkSql常用语句
  • 原文地址:https://www.cnblogs.com/RainbowCrown/p/11600443.html
Copyright © 2011-2022 走看看