标签:
这题其实挺简单,可是自己就是被坑了很长时间,究其原因,脑袋短路了。本来排完序之后,应该把结果按照未排序之前的顺序输出,结果我就直接输出了,而题目给的例子正好是按顺序给的,输出没有问题,哎,果然够坑。以后再也不能相信题目给的例子了。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<stack> #include<queue> using namespace std; int seat[31][31]; bool visited[31][31]; int m,n,k,feeling,ans_x,ans_y; struct come { int hh,mm,person; int id;//之前就是没有这个,总是WA。 }data[52]; struct result { int x,y; }ans[52]; bool cmp(come a,come b) { if(a.hh==b.hh) return a.mm<b.mm; return a.hh<b.hh; } bool judge(int x,int y,int id) { int k=data[id].person+y; if(k-1>m) return false; for(int i=y;i<k;i++) if(visited[x][i]) return false; return true; } void set_true(int x,int y,int id) { int k=data[id].person+y; for(int i=y;i<k;i++) visited[x][i]=true; } void dfs(int id) { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(visited[i][j]) continue; if(judge(i,j,id)) if(feeling<seat[i][j]) feeling=seat[i][j],ans_x=i,ans_y=j; if((m-j+1)<data[id].person) break; } } } void get_max() { int t=-100000000; ans_x=0,ans_y=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(visited[i][j]==false) if(t<seat[i][j]) t=seat[i][j],ans_x=i,ans_y=j; } int main() { while(scanf("%d%d%d",&n,&m,&k)) { if(n==0&&m==0&&k==0) break; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&seat[i][j]); for(int i=1;i<=k;i++) { scanf("%d:%d %d",&data[i].hh,&data[i].mm,&data[i].person); data[i].id=i; } sort(data+1,data+k+1,cmp); memset(visited,false,sizeof(visited)); for(int i=1;i<=k;i++) { feeling=-100000000,ans_x=0,ans_y=0; dfs(i); if(ans_x!=0) { ans[data[i].id].x=ans_x,ans[data[i].id].y=ans_y; set_true(ans_x,ans_y,i); } else { get_max(); if(ans_x==0) ans[data[i].id].x=-1; else { ans[data[i].id].x=ans_x,ans[data[i].id].y=ans_y; visited[ans_x][ans_y]=true; } } } for(int i=1;i<=k;i++) { if(ans[i].x!=-1) printf("%d %d\n",ans[i].x,ans[i].y); else printf("-1\n"); } } return 0; }
HDU 3262 Seat taking up is tough
标签:
原文地址:http://blog.csdn.net/u013621213/article/details/43307235