HDU 3262 Seat taking up is tough

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3262

题目大意:教室里有N*M个座位,每个座位都有一个舒适值,有K个学生进入教室占座,先到的先占。第k个学生需要占Ki个坐连续的座,并要求最西边的舒适值最高。如果无法占连续的Ki个座位,那么这个学生就会占一个舒适值最高的座(好自私...)。如果占不到座位,就会离开教室。

分析:普通的模拟,不过因为没读穿题导致WA两次悲剧...

 

代码:

View Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 2000000
int a[51][51],n,m,p,tx,ty;
bool b[51][51];
struct node
{
int t,d,id,x,y;
} e[51];
bool cmp(node p1,node p2){return p1.t<p2.t;}
bool cmp1(node p1,node p2){return p1.id<p2.id;}
void find(int x)
{
int k,t=e[x].d,ans=-INF;
tx=-1;ty=-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j+t-1<=m;j++)
{
for(k=j;k<j+t;k++)if(b[i][k])break;
if(k==j+t&&a[i][j]>ans){ans=a[i][j];tx=i;ty=j;}
}
}
if(ans!=-INF)
{
for(k=ty;k<ty+t;k++)b[tx][k]=1;
return ;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)if(b[i][j]==0&&a[i][j]>ans){ans=a[i][j];tx=i;ty=j;}
if(ans!=-INF)b[tx][ty]=1;
}
int main()
{
freopen("in","r",stdin);
freopen("out","w",stdout);
int x,y,d;
char str[100];
for (scanf("%d%d%d",&n,&m,&p);p&&m&&p;scanf("%d%d%d",&n,&m,&p))
{
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);
for(int i=1;i<=p;i++)
{
scanf("%s%d",str,&d);
x=(str[0]-'0')*10+(str[1]-'0');
y=(str[3]-'0')*10+(str[4]-'0');
e[i].t=x*60+y;e[i].d=d;e[i].id=i;
}
sort(e+1,e+p+1,cmp);
for(int i=1;i<=p;i++)
{
find(i);
e[i].x=tx;e[i].y=ty;
}
sort(e+1,e+p+1,cmp1);
for(int i=1;i<=p;i++)
{
if(e[i].x==-1)printf("-1\n");
else printf("%d %d\n",e[i].x,e[i].y);
}
}
return 0;
}



你可能感兴趣的:(HDU)