Description
Input
Output
题目大意:有n*m个座位,每个座位有一个权,每个学生来到之后会占座位,他占的座位一点在同一行而且连续,他一定会做在那排连续座位的最左边。在占到他想占的数量座位的前提下,他会找权值最大的座位来坐。如果不能帮别人占座位,他会自己选择一个权值最大的座位来坐而不帮朋友占座了。如果连自己的座位都没有,他会选择离开。现在有k个学生分别来占座,问他们占到的自己座位的坐标是什么,若离开了就输出-1.
思路:大水题,对每个学生的到达时间线排个序(不排会WA我试过了O(∩_∩)O),然后对每一个学生,先暴力枚举连续q个座位看能不能坐,能则选最大的,不能则再次暴力枚举空座位,选最大的,还是不能就只能滚粗了……最后按原来给的顺序输出答案即可。
代码(15MS):
1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #include <cstring> 5 using namespace std; 6 7 const int MAXN = 35; 8 const int MAXK = 55; 9 10 struct Node { 11 int id, t, q; 12 void read(int i) { 13 int hh, mm; 14 scanf("%d:%d %d", &hh, &mm, &q); 15 t = hh * 60 + mm; 16 id = i; 17 } 18 bool operator < (const Node &rhs) const { 19 return t < rhs.t; 20 } 21 }; 22 23 Node a[MAXK]; 24 int mat[MAXN][MAXN]; 25 bool use[MAXN][MAXN]; 26 int ans[MAXK][2], leave[MAXK]; 27 int n, m, k; 28 29 void init() { 30 memset(use, 0, sizeof(use)); 31 } 32 33 bool check(int x, int y, int l) { 34 for(int i = 0; i < l; ++i) 35 if(use[x][y + i]) return false; 36 return true; 37 } 38 39 void make_use(int x, int y, int l) { 40 for(int i = 0; i < l; ++i) 41 use[x][y + i] = true; 42 } 43 44 void solve() { 45 int max_comf, ans_i, ans_j; 46 bool flag; 47 for(int x = 1; x <= k; ++x) { 48 flag = false; 49 for(int i = 1; i <= n; ++i) { 50 for(int j = 1; j <= m - a[x].q + 1; ++j) { 51 if(!flag || mat[i][j] > max_comf) { 52 if(!check(i, j, a[x].q)) continue; 53 flag = true; 54 ans_i = i; ans_j = j; 55 max_comf = mat[i][j]; 56 } 57 } 58 } 59 if(flag) { 60 leave[a[x].id] = false; 61 ans[a[x].id][0] = ans_i; 62 ans[a[x].id][1] = ans_j; 63 make_use(ans_i, ans_j, a[x].q); 64 continue; 65 } 66 for(int i = 1; i <= n; ++i) { 67 for(int j = 1; j <= m; ++j) { 68 if(!flag || mat[i][j] > max_comf) { 69 if(use[i][j]) continue; 70 flag = true; 71 ans_i = i; ans_j = j; 72 max_comf = mat[i][j]; 73 } 74 } 75 } 76 if(flag) { 77 leave[a[x].id] = false; 78 ans[a[x].id][0] = ans_i; 79 ans[a[x].id][1] = ans_j; 80 use[ans_i][ans_j] = true; 81 continue; 82 } 83 else leave[a[x].id] = true; 84 } 85 } 86 87 int main() { 88 while(scanf("%d%d%d", &n, &m, &k) != EOF) { 89 if(n == 0 && m == 0 && k == 0) break; 90 for(int i = 1; i <= n; ++i) 91 for(int j = 1; j <= m; ++j) scanf("%d", &mat[i][j]); 92 for(int i = 1; i <= k; ++i) a[i].read(i); 93 sort(a + 1, a + k + 1); 94 init(); 95 solve(); 96 for(int i = 1; i <= k; ++i) { 97 if(leave[i]) puts("-1"); 98 else printf("%d %d\n", ans[i][0], ans[i][1]); 99 } 100 } 101 }