您的位置:首页 > 其它

H - Selecting courses HDU - 3697 (暴力,枚举,贪心)

2017-07-27 18:58 525 查看

题目链接:点击打开链接

题意:有 n 门课,每一门课需要在规定时间段内选完,且每过五分钟只能选一次,问最多可以选多少门课?

题解:
         1,将这 n 个时间段排序(按结束时间从小到大,结束时间相同,那么就使开始时间小的在前,结构题排序很简便,一个 sort 就解决了)
         2,然后循环暴,第一个循环是0,1,2,3,4;因为是每五分钟选一门,所以在前五秒时开始选是最多的。
         3,第二个循环是每次选课的时间点。
         4,第三个循环是可以选的课(此时已排序,直接从 0 到 n 就行,因为如果已经选过,就不能再选,所以需要标记选过的)

详情请见代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<iomanip>
#include<vector>
#include<algorithm>
using namespace std;

struct SECOND{
int a; int b;
}SECOND[500];

bool cnt(struct SECOND A,struct SECOND B)
{
if(A.b==B.b){
return A.a<B.a;
}
else
return A.b<B.b;
}
int main()
{
int n;
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
cin>>SECOND[i].a>>SECOND[i].b;
sort(SECOND,SECOND+n,cnt);

int cntt=0;
int vis[500];

for(int i=0;i<5;i++)
{
int num=0;
memset(vis,0,sizeof(vis));
for(int j=i;j<SECOND[n-1].b;j+=5)
{
for(int k=0;k<n;k++)
{
if(vis[k]) continue;
if(j>=SECOND[k].a&&j<SECOND[k].b&&vis[k]==0)
{
num++;
vis[k]=1;
break;
}
}
}
cntt=max(cntt,num);

}

cout<<cntt<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: