比赛 模拟测试2 评测结果 WWWWWTTTTT
题目名称 火车调度 最终得分 0
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-10-12 21:49:39
显示代码纯文本
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAXN=105;

struct Node
{
	int in,out;
}tr[MAXN];

bool operator < (Node a,Node b)
{
	return a.in<b.in||(a.in==b.in&&a.out<b.out);
}

int n,m,re;

int d[MAXN];
void greed()
{
	for(int i=0;i<n;i++)
	{
		d[i]=1;
		for(int j=0;j<i;j++)
			if (tr[j].in<=tr[i].in&&tr[j].out<tr[i].out&&d[j]+1>d[i])
			{
				d[i]=d[j]+1;
				if (d[i]>re)
					re=d[i];
			}
	}
}

int q[MAXN],ps=0,pt=0;
int stack[MAXN],top;

inline void out(const int &dep)
{
	stack[top++]=ps;
	for(int i=ps;i<pt;i++)
		if (tr[q[i]].out<=tr[dep].in)
			ps++;
		else break;
}

inline void in(const int &dep)
{
	ps=stack[--top];
}

inline bool can(const int &dep)
{
	if (pt-ps>=m)
		return false;
	if (pt-ps==0)
		return true;
	if (tr[dep].out>=tr[q[pt-1]].out) return true;
	else return false;
}

inline void push(const int &dep)
{
	q[pt++]=dep;
}

inline void pop(const int &dep)
{
	pt--;
}

bool used[MAXN];
void search(int dep,int t)
{
	if (n-dep+t<=re)
		return ;
	if (dep==n)
	{
		re=t;
		return ;
	}
	out(dep);
	used[dep]=false;
	search(dep+1,t);
	if (can(dep))
	{
		push(dep);
		used[dep]=true;
		search(dep+1,t+1);
		pop(dep);
		used[dep]=false;
	}
	in(dep);
}

int main()
{
	freopen("train.in","r",stdin);
	freopen("train.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
		scanf("%d%d",&tr[i].in,&tr[i].out);
	sort(tr,tr+n);
	greed();
	search(0,0);
	printf("%d\n",re);
	return 0;
}