zoukankan      html  css  js  c++  java
  • bzoj 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚【贪心+堆||差分】

    这个题方法还挺多的,不过洛谷上要输出方案所以用堆最方便
    先按起始时间从小到大排序。
    我用的是greater重定义优先队列(小根堆)。用pair存牛棚用完时间(first)和牛棚编号(second),每次查看队首的first是否比当前牛的起始时间早,是则弹出队首记录当前牛的答案,再把新的pair放进去,否则增加牛棚,同样要塞进队里

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int N=200005;
    int n,ans,bl[N];
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
    struct qwe
    {
    	int l,r,id;
    }a[N];
    bool cmp(const qwe &a,const qwe &b)
    {
    	return a.l<b.l||(a.l==b.l&&a.r<b.r);
    }
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    int main()
    {
    	n=read();
    	for(int i=1;i<=n;i++)
    		a[i].l=read(),a[i].r=read(),a[i].id=i;
    	sort(a+1,a+1+n,cmp);
    	ans=1,bl[a[1].id]=1;
    	q.push(make_pair(a[1].r,1));
    	for(int i=2;i<=n;i++)
    	{
    		if(q.top().first<a[i].l)
    		{
    			bl[a[i].id]=q.top().second;
    			q.push(make_pair(a[i].r,q.top().second));
    			q.pop();
    		}
    		else
    		{
    			bl[a[i].id]=++ans;
    			q.push(make_pair(a[i].r,ans));
    		}
    	}
    	printf("%d
    ",ans);
    	// for(int i=1;i<=n;i++)
    		// printf("%d
    ",bl[i]);
    	return 0;
    }
    

    如果不输出方案的话,因为时间范围是1e6,所以直接差分做即可

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=1000005;
    int n,ans,mx,t[N];
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    int main()
    {
    	n=read();
    	for(int i=1;i<=n;i++)
    	{
    		int l=read(),r=read();
    		t[l]++,t[r+1]--;
    		mx=max(mx,r);
    	}
    	for(int i=1;i<=mx;i++)
    		ans=max(ans,t[i]+=t[i-1]);
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题
    C++中的预处理命令 .
    C++ sizeof用法 .
    详解C/C++预处理器 .
    C 风格字符串,C++string类,MFC,CString类的区别。
    VC: GDI绘图基本步骤总结 .
    关于字符数组 和 字符串比较 C++
    they're hiring
    HTTP Proxy Server
    Polipo
  • 原文地址:https://www.cnblogs.com/lokiii/p/8982554.html
Copyright © 2011-2022 走看看