HDU 3262/POJ 3829 Seat taking up is tough(模拟+搜索)(2009 Asia Ningbo Regional)
Description
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
Output
题目大意:有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)的更多相关文章
- 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 ...
- HDU 3262 Seat taking up is tough (模拟搜索)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3262 题意:教室有n*m个座位,每个座位有一个舒适值,有K个学生在不同时间段进来,要占t个座位,必须是连 ...
- POJ 3829 Seat taking up is tough(——只是题目很长的模拟)
题目链接: http://poj.org/problem?id=3829 题意描述: 输入矩阵的大小n和m,以及来占位置的人数k 输入n*m的教室座位矩阵,每个值表示该座位的满意度 输入每个人来占位置 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- HDU 3126 Nova [2009 Asia Wuhan Regional Contest Online]
标题效果 有着n巫妖.m精灵.k木.他们都有自己的位置坐标表示.冷却时间,树有覆盖范围. 假设某个巫妖攻击精灵的路线(他俩之间的连线)经过树的覆盖范围,表示精灵被树挡住巫妖攻击不到.求巫妖杀死所有精灵 ...
随机推荐
- 《黑客攻防技术宝典Web实战篇@第2版》读书笔记1:了解Web应用程序
读书笔记第一部分对应原书的第一章,主要介绍了Web应用程序的发展,功能,安全状况. Web应用程序的发展历程 早期的万维网仅由Web站点构成,只是包含静态文档的信息库,随后人们发明了Web浏览器用来检 ...
- UML类图介绍以及PlantUML使用方法
类的UML表示方法 UML介绍 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是 ...
- MySQL5.7主从同步--点位方式及GTID方式
MySQL5.6加入了GTID的新特性,其全称是Global Transaction Identifier,可简化MySQL的主从切换以及Failover.GTID用于在binlog中唯一标识一个事务 ...
- IE8 如何 不显示 选项 卡,直接在任务显示 各个页面?
IE8 如何 不显示 选项 卡,直接在任务显示 各个页面? 在 工具->Internet 选项(o) ->常规--选项卡-设置->把第一个勾去掉 “启用选项卡浏览(需要重新启动 ...
- 安装cronsun管理定时脚本
1. cronsun 是一个分布式任务系统,单个结点和 *nix 机器上的 crontab 近似.支持界面管理机器上的任务,支持任务失败邮件提醒,安装简单,使用方便,是替换 crontab 一个不错的 ...
- Python 爬虫 (三)
#对第一章的百度翻译封装的函数进行更新 1 from urllib import request, parse from urllib.error import HTTPError, URLError ...
- Python前戏
1.Python解释器 官网:https://www.python.org/getit/ 因为Python的3.0和2.0版本有所差别,所以根据个人学习方向分别下载安装. 安装验证:打开命令提示符,执 ...
- Java线程和多线程(十一)——BlockingQueue
这次讨论的是Java的BlockingQueue,java.util.concurrent.BlockingQueue是一个Java的队列接口,支持一系列操作,比如,在获取和移除对象的时候如果队列为空 ...
- Web服务器、Web容器、Application服务器、反向代理服务器的区别与联系
在Web开发中,经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server).反向代理服务器(Reverse Proxy ...
- Kubernetes网络方案的三大类别和六个场景
欢迎访问网易云社区,了解更多网易技术产品运营经验. 本文章根据网易云资深解决方案架构师 王必成在云原生用户大会上的分享整理. 今天我将分享个人对于网络方案的理解,以及网易云在交付 Kubernetes ...