POJ 3988 Selecting courses
题目链接:http://poj.org/problem?id=3988
题意:每种课都有自己的开始开始和结束时间,学生任选一时间点开始选课,一旦开始每5分钟只能选且必选(如果可以)一次。求学生能选到的最多的课数。
分析:因为一开始没仔细看题,没注意到是严格的每5分钟选一次,导致往DP的方向想了半天,WA一次,又因为没注意在结束时刻的课是不能选的(题目也没说太清楚),又WA了一次...杯具。
其实这个题就是一个贪心,因为n很小,n^2就可以过,所以实现很简单:因为每严格5分钟选一次,我们就可以枚举第一次选课的时间,因为枚举超过5次之后就和往前数第5次重合了,且不如那一个优(因为少考虑了一个),所以我们只枚举从最早的开始点开始的5个点就可以了。如果当前的时间有2个或以上的课可以选,则选结束时间最早的那个。
附代码:
View Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n,ans;
int x[510],y[510];
int Min,Max,tans,pos;
bool b[510];
int main()
{
for (scanf("%d",&n);n;scanf("%d",&n))
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
ans=0;
Min=200000;Max=0;
for (int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
Min=min(Min,x[i]);
Max=max(y[i],Max);
}
for (int i=0;i<5;i++)
{
memset(b,false,sizeof(b));
tans=0;
for (int j=i;j<=1000;j+=5)
{
pos=-1;
for (int k=1;k<=n;k++)
if (!b[k] && x[k]<=j && y[k]>j)
if (pos==-1 || y[pos]>y[k]) pos=k;
if (pos!=-1)
{
tans++;
b[pos]=true;
}
}
ans=max(ans,tans);
}
printf("%d\n",ans);
}
//system("pause");
return 0;
}
英文题着实让我上火...google翻译的跟shit一样...