POJ 3829 Seat taking up is tough(——只是题目很长的模拟)
Posted Reqaw’s Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3829 Seat taking up is tough(——只是题目很长的模拟)相关的知识,希望对你有一定的参考价值。
题目链接:
http://poj.org/problem?id=3829
题意描述:
输入矩阵的大小n和m,以及来占位置的人数k
输入n*m的教室座位矩阵,每个值表示该座位的满意度
输入每个人来占位置的时间和需要几个位置h,m,q
计算并输出每个来占位置的人根据占位规则得到的坐标zx,zy,若一个位置都没有了,输出-1。
规则:
首先看有没有在同一行上的连续的k个座位,有则这个占位的同学坐在这连续k个座位的最左边,如果有多行上都存在连续的k个位置,则该占位的同学会选择最左边值最大的位置(坑点就在这,不是k个位置
的和最大),如果不存在在同一行上的连续的k个位置,则只需在现有的空位上挑一个满意度最大的给自己坐就行了,如果一个位置都没有了,就输出-1。
另外题目需要按照提问的顺序给出答案,也就是说给的时间可能使乱序的,但是最后输出结果的时候要按照提问顺序输出答案。
AC代码:
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 int inf=99999999; 5 int a[40][40]; 6 struct T 7 { 8 int z,h,m,q,zx,zy,f; //z表示提问顺序,最后按该值排序 9 }; //f表示该占位同学能否找到一个位置 10 struct T t[60]; 11 int cmp(struct T a,struct T b) 12 { //先按照小时排,再按分钟排 13 if(a.h<b.h) 14 return 1; 15 else if(a.h==b.h) 16 { 17 if(a.m<b.m) 18 return 1; 19 else 20 return 0; 21 } 22 return 0; 23 } 24 int cmp1(struct T a,struct T b) 25 { 26 return a.z<b.z; 27 } 28 int main() 29 { 30 int i,j,k,l,m,n,b[60],qq; 31 long long max; 32 while(scanf("%d%d%d",&n,&m,&qq), n+m+qq != 0) 33 { 34 for(i=1;i<=n;i++) 35 for(j=1;j<=m;j++) 36 scanf("%d",&a[i][j]); 37 for(j=1;j<=n;j++) //表示该行还有几个座位 38 b[j]=m; 39 for(i=1;i<=qq;i++) 40 { 41 t[i].f=0; 42 t[i].z=i; 43 scanf("%d:%d%d",&t[i].h,&t[i].m,&t[i].q); 44 } 45 sort(t+1,t+qq+1,cmp); 46 /*for(i=1;i<=qq;i++) 47 printf("%d %d %d\n",t[i].h,t[i].m,t[i].q);*/ 48 for(l=1;l<=qq;l++) 49 { 50 max=-inf; 51 int x;int y; 52 long long sum; 53 int s=0; 54 for(i=1;i<=n;i++) 55 if(b[i]==0) s++; 56 if(s==n) 57 { 58 t[l].f=0; 59 continue; 60 } 61 for(i=1;i<=n;i++) 62 { 63 sum=0; 64 if(b[i]>=t[l].q) 65 { 66 for(j=1;j<=m-t[l].q+1;j++) 67 { 68 sum=a[i][j]; 69 for(k=j;k<j+t[l].q;k++) 70 if(a[i][k]==-inf) break; 71 if(k==j+t[l].q&&max<sum) 72 { 73 max=sum; 74 x=i;y=j; 75 } 76 } 77 } 78 } 79 if(max==-inf) 80 { 81 int mx1=-inf; 82 for(i=1;i<=n;i++) 83 { 84 for(j=1;j<=m;j++) 85 { 86 if(mx1<a[i][j]) 87 { 88 mx1=a[i][j]; 89 x=i;y=j; 90 } 91 } 92 } 93 b[x]--; 94 a[x][y]=-inf; 95 } 96 else 97 { 98 b[x]-=t[l].q; 99 for(j=y;j<y+t[l].q;j++) 100 a[x][j]=-inf; 101 } 102 t[l].f=1; 103 t[l].zx=x; 104 t[l].zy=y; 105 } 106 sort(t+1,t+qq+1,cmp1); 107 for(i=1;i<=qq;i++) 108 { 109 if(t[i].f) 110 printf("%d %d\n",t[i].zx,t[i].zy); 111 else 112 printf("-1\n"); 113 } 114 } 115 return 0; 116 }
以上是关于POJ 3829 Seat taking up is tough(——只是题目很长的模拟)的主要内容,如果未能解决你的问题,请参考以下文章
The 2018 ACM-ICPC Chinese Collegiate Programming Contest Take Your Seat
2018-2019 ACM-ICPC, China Multi-Provincial Collegiate D. Take Your Seat(数学概率)
[2016-03-11][POJ][1609][Tiling Up Blocks]
nsurlsessiond - taking up all bandwidth!! Help ?
seek for|contrary to|lag behind|take up|take advantage of|be confident of|allow for |