Description

Students often have problems taking up seats. When two students want the same seat, a quarrel will probably begin. It will have very bad effect when such subjects occur on the BBS.  So, we urgently need a seat-taking-up rule. After several days of argument, the rule finally comes out:  As shown in the figure below, the seats in a classroom form a n×m grid( n rows and m columns), and every cell in the grid represents a seat. The coordinates of the seat in the north-west corner are (1,1) and the coordinates of the seat in the south-east corner seat are (n,m). As you know, some seats make you feel good and some seats don’t. So every seat has a “feeling index”. Students can take up seats for himself and his friends. Of course, if a seat is already taken up by a student, it can’t be taken up by others.  For the convenience of communication between friends, when a student is trying to take up seats, he wants all the seats he needs to be consecutive and in the same row. If he can do that, he takes up all the seats he needs, and save the most western one for himself. For example, if a student wants to take up 3 seats, then taking (2,2),(2,3),(2,4) and saving (2,2) for himself is ok; but taking (2,2),(2,4),(2,5) is invalid because those seats are not consecutive. Under the precondition of accomplishing his seat-taking job, a student always wants the “feeling index” of his seat to be as large as possible.  However, if a student cannot take up all the seats he needs, he will just try to take up only one seat for himself because he doesn’t want to get into the trouble of explaining “Why they can get seats but I can’t?” to some of his friends. Of course he still wants the “feeling index” of his seat to be as large as possible in that situation.  Everyone wants to know where are the seats he can take up .This problem seems a little bit complicated for them. So they want you to write a program to solve the problem. 
 

Input

There are several test cases and the input ended by a line of “0 0 0”.  For each test case:  The first line contains three integers: n , m and k ( 1 <= n,m<=30, 1<=k<=50). It means that there are n rows of seats in the classroom and there are m seats in every row. k is the number of students who come into the classroom trying to take up seats.  Following are n lines describing the seats by north to south order .Each line represents a row of seats and contains m integers, indicating the “feeling index” of every seat in that row, by west to east order. “Feeling index” can be fit in a 32-bit integer.  Then k lines follow (We call them k “student lines”). Each line is in the format of “hh:mm q” ( 0 <= hh < 24, 0 <=mm <= 59, 1<=q<=50 ) meaning that a student comes into the classroom at mm minutes past hh o’clock, trying to take up q seats. mm and hh are all two digit integers with possible leading zero, and q is also an integer. Please note that when a student enters the class room, he begins to do his seat taking job immediately and the job takes no time.  It is guaranteed that the “feeling index” of every seat is different and no students come into the classroom at the same time. 
 

Output

You should output k lines for each test case, in the order that correspondent to the above mentioned k “student lines” in the input. Each line must contain two integers indicating the coordinates of the seat which is saved by the student for himself. If the student can’t take up any seats, just output a “-1” instead.

题目大意:有n*m个座位,每个座位有一个权,每个学生来到之后会占座位,他占的座位一点在同一行而且连续,他一定会做在那排连续座位的最左边。在占到他想占的数量座位的前提下,他会找权值最大的座位来坐。如果不能帮别人占座位,他会自己选择一个权值最大的座位来坐而不帮朋友占座了。如果连自己的座位都没有,他会选择离开。现在有k个学生分别来占座,问他们占到的自己座位的坐标是什么,若离开了就输出-1.

思路:大水题,对每个学生的到达时间线排个序(不排会WA我试过了O(∩_∩)O),然后对每一个学生,先暴力枚举连续q个座位看能不能坐,能则选最大的,不能则再次暴力枚举空座位,选最大的,还是不能就只能滚粗了……最后按原来给的顺序输出答案即可。

代码(15MS):

 #include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std; const int MAXN = ;
const int MAXK = ; struct Node {
int id, t, q;
void read(int i) {
int hh, mm;
scanf("%d:%d %d", &hh, &mm, &q);
t = hh * + mm;
id = i;
}
bool operator < (const Node &rhs) const {
return t < rhs.t;
}
}; Node a[MAXK];
int mat[MAXN][MAXN];
bool use[MAXN][MAXN];
int ans[MAXK][], leave[MAXK];
int n, m, k; void init() {
memset(use, , sizeof(use));
} bool check(int x, int y, int l) {
for(int i = ; i < l; ++i)
if(use[x][y + i]) return false;
return true;
} void make_use(int x, int y, int l) {
for(int i = ; i < l; ++i)
use[x][y + i] = true;
} void solve() {
int max_comf, ans_i, ans_j;
bool flag;
for(int x = ; x <= k; ++x) {
flag = false;
for(int i = ; i <= n; ++i) {
for(int j = ; j <= m - a[x].q + ; ++j) {
if(!flag || mat[i][j] > max_comf) {
if(!check(i, j, a[x].q)) continue;
flag = true;
ans_i = i; ans_j = j;
max_comf = mat[i][j];
}
}
}
if(flag) {
leave[a[x].id] = false;
ans[a[x].id][] = ans_i;
ans[a[x].id][] = ans_j;
make_use(ans_i, ans_j, a[x].q);
continue;
}
for(int i = ; i <= n; ++i) {
for(int j = ; j <= m; ++j) {
if(!flag || mat[i][j] > max_comf) {
if(use[i][j]) continue;
flag = true;
ans_i = i; ans_j = j;
max_comf = mat[i][j];
}
}
}
if(flag) {
leave[a[x].id] = false;
ans[a[x].id][] = ans_i;
ans[a[x].id][] = ans_j;
use[ans_i][ans_j] = true;
continue;
}
else leave[a[x].id] = true;
}
} int main() {
while(scanf("%d%d%d", &n, &m, &k) != EOF) {
if(n == && m == && k == ) break;
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j) scanf("%d", &mat[i][j]);
for(int i = ; i <= k; ++i) a[i].read(i);
sort(a + , a + k + );
init();
solve();
for(int i = ; i <= k; ++i) {
if(leave[i]) puts("-1");
else printf("%d %d\n", ans[i][], ans[i][]);
}
}
}

HDU 3262/POJ 3829 Seat taking up is tough(模拟+搜索)(2009 Asia Ningbo Regional)的更多相关文章

  1. HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)

    Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...

  2. HDU 3262 Seat taking up is tough (模拟搜索)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3262 题意:教室有n*m个座位,每个座位有一个舒适值,有K个学生在不同时间段进来,要占t个座位,必须是连 ...

  3. POJ 3829 Seat taking up is tough(——只是题目很长的模拟)

    题目链接: http://poj.org/problem?id=3829 题意描述: 输入矩阵的大小n和m,以及来占位置的人数k 输入n*m的教室座位矩阵,每个值表示该座位的满意度 输入每个人来占位置 ...

  4. HDU 3260/POJ 3827 Facer is learning to swim(DP+搜索)(2009 Asia Ningbo Regional)

    Description Facer is addicted to a game called "Tidy is learning to swim". But he finds it ...

  5. HDU 3264/POJ 3831 Open-air shopping malls(计算几何+二分)(2009 Asia Ningbo Regional)

    Description The city of M is a famous shopping city and its open-air shopping malls are extremely at ...

  6. HDU 3268/POJ 3835 Columbus’s bargain(最短路径+暴力枚举)(2009 Asia Ningbo Regional)

    Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera ...

  7. HDU 3269 P2P File Sharing System(模拟)(2009 Asia Ningbo Regional Contest)

    Problem Description Peer-to-peer(P2P) computing technology has been widely used on the Internet to e ...

  8. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  9. HDU 3126 Nova [2009 Asia Wuhan Regional Contest Online]

    标题效果 有着n巫妖.m精灵.k木.他们都有自己的位置坐标表示.冷却时间,树有覆盖范围. 假设某个巫妖攻击精灵的路线(他俩之间的连线)经过树的覆盖范围,表示精灵被树挡住巫妖攻击不到.求巫妖杀死所有精灵 ...

随机推荐

  1. JavaScript面向对象(封装)

    阮一峰的网络日志 1.生成实例对象的原始模式 var People = { name : '', age : '' } 根据这个原型对象生成两个实例对象 var people1 = {}; peopl ...

  2. linux配置mysq与navicat关联

    第一步:在linux中安装mysql(执行如下语句) 安装 mysql: yum install mysql yum install mysql-server yum install mysql-de ...

  3. Const 关键字详解

    const 标识符 在c++中作为常量修饰符 用来修饰 函数 变量  指针 const 修饰的变量不可以改变值 const 在修饰指针的时候 const 标识符出现在*的左边表示 指向的变量为常量不能 ...

  4. windows10上安装mysql

    环境:windwos 10(1511) 64bit.mysql 5.7.14 一.下载mysql 1. 在浏览器里打开mysql的官网http://www.mysql.com/ 2. 进入页面顶部的& ...

  5. LogViewer超大文本浏览工具

    官方下载 LogViewer 是一款简单好用的log日志文件查看工具.您想要查看log日志吗?那么不妨来看看这款LogViewer .该款工具可以在短短数秒内打开上G的LOG文件,支持高亮某行文字(例 ...

  6. mysql中用HEX和UNHEX函数处理二进制数据的导入导出

    读取数据并拼写sql语句,然后进行导入.具体方法为: (1)导出时采用HEX函数读取数据,把二进制的数据转为16进制的字符串: select HEX(binField) from testTable; ...

  7. ubuntu下安装应用(搜狗输入法)

  8. 如何判断一个 APP页面是否是H5页面(转载)

    1.无网络断开网络,显示404或则错误页面的是H5 2.页面布局a.在手机设置.开发者选项中开启显示布局边界功能:b.进入应用查看布局边界:c.原生应用可以看到各个控件的布局边界,H5只有整个页面的一 ...

  9. openWrt libubox组件之uloop原理分析

    1.    libubox概述 libubox是openwrt新版本中的一个基础库,有很多应用是基于libubox开发的,如uhttpd,netifd,ubusd等. libubox主要提供以下两种功 ...

  10. Python-入门必备

    ·Python入门必备 @ 交互式编程 交互式编程不需要创建脚本文件,而是直接通过Python解释器的交互模式进来编写代码.下面我们来打开python自带的交互式编程客户端,打印一个hello,wor ...