射击比赛 (POJ 1719) 题解
【问题描述】
我们假设射击的目标是一个由R*C(2≤R≤C≤ 1000)个小方格组成的矩形网格。网格中每一列恰有2个白色的小方格和R-2个黑色的小方格。定义网格的行从顶至底编号为1~R,列从左至右编号为1~C。 射击者可射击C次。在连续的C次射击中,若每列恰好有一个白色的方格被射中,且不存在无白色方格被射中的行,这样的射击才是正确的。现给出N组数据,对于每组数据,如果存在正确的射击方法,则要求找到它,若不存在,输出NO。
【样例输入】
2
4 4
2 4
3 4
1 3
1 4
5 5
1 5
2 4
3 4
2 4
2 3
【样例输出】
2 3 1 4
NO
【解题思路】
本题为1997年CEOI最后一题,解题的思路主要在于贪心策略与贪心的证明。
贪心策略:
1、统计所有行包含的白格数。
2、从还没有射击格的行中选出一个白格数最少的。
3、检查所选的行 (1)若所选行的白格数为0,则输出无解; (2)否则从所选行的白格中任选一个作为射击格,并将与该格同列的另一 个白格所处行的白格数减1。
4、返回到第2步,直到所有的行都有射击格。
5、若还有列没有选射击格,则在该列任选一白格作为射击格即可。
贪心证明:
用h[i]表示第i行的白格数。如果最开始的时候: ①min{h[i]}=0:第i行已经没有办法找到可作为射击格的白格,那么问题只能无解。 ②min{h[i]}=1:那么第i行的这一个白格必须要作为射击格,否则将因第i行没有射击格而造成问题无解。
③min{h[i]}≥2:那么在这一 行任选一个白格,顶多只会造成剩余行中有一行h值为1,再处理那一行,最多也只会再造成剩余行中有一行h 值为1,如此往复,将保持h值为1的行数不超过1行,最后最坏的情况也是造成最后一行的h值为1,继续下去所有行就都已选取了射击格了。因此,如果原问题有解,该贪心方法一定能找到一种正确的方案。由此可以证明,此贪心方法是正确的。确定贪心标准。
【代码实现】
var a:array[..] of longint;
b:array[..,..] of boolean;
fr,fc:array[..] of boolean;
ans:array[..] of longint;
n,i,j,r,c,x1,x2,k,pos,min,code,q:longint;
flag:boolean;
begin
readln(code);
for q:= to code do
begin
fillchar(fr,sizeof(fr),false);
fillchar(fc,sizeof(fc),false);
fillchar(a,sizeof(a),);
fillchar(b,sizeof(b),);//注意初始化,没初始化WA几次……
readln(r,c);
for i:= to c do
begin
readln(x1,x2);
b[x1,i]:=true;b[x2,i]:=true;
inc(a[x1]);inc(a[x2]);
end;
repeat
min:=maxlongint;
flag:=true;
for i:= to r do
if not(fr[i]) then
break;
if not(fr[i]) then
flag:=false;
if flag then break;
for i:= to r do
if (a[i]<min)and(not(fr[i])) then
begin
min:=a[i];
pos:=i;
end;
if a[pos]= then
begin
writeln('NO');
break;
end;
fr[pos]:=true;
for j:= to c do
if (b[pos,j])and(not(fc[j])) then
begin
ans[j]:=pos;fc[j]:=true;
for k:= to r do
if (b[k,j])and(k<>pos) then
dec(a[k]);
break;
end;
until flag;
if a[pos]= then
continue;
for i:= to c do
if ans[i]= then
for j:= to r do
if b[j,i] then
begin
ans[i]:=j;
break;
end;
write(ans[]);
for i:= to c do
write(' ',ans[i]);
writeln;
end;
end.
射击比赛 (POJ 1719) 题解的更多相关文章
- PAT 1082. 射击比赛 (20)
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原点(0,0). 输入 ...
- PAT 1082 射击比赛
https://pintia.cn/problem-sets/994805260223102976/problems/994805260990660608 本题目给出的射击比赛的规则非常简单,谁打的弹 ...
- POJ 1719 Shooting Contest(二分图匹配)
POJ 1719 Shooting Contest id=1719" target="_blank" style="">题目链接 题意:给定一个 ...
- PAT 1082 射击比赛(20)(代码+思路)
1082 射击比赛(20 分) 本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们 ...
- PAT(B) 1082 射击比赛(Java)
题目链接:1082 射击比赛 (20 point(s)) 题目描述 本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y ...
- PAT Basic 1082 射击比赛 (20 分)
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原点(0,0). 输入 ...
- 1082 射击比赛 (20 分)C语言
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原点(0,0). 输入 ...
- PAT (Basic Level) Practice (中文)1082 射击比赛 (20 分)
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原点(0,0). 输入 ...
- P1082 射击比赛
P1082 射击比赛 转跳点:
- PAT乙级:1082 射击比赛 (20分)
PAT乙级:1082 射击比赛 (20分) 题干 本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找 ...
随机推荐
- Problem 2195 检查站点(普通树构造)(Vector)
Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 在山上一共有N个站点需要检查,检查员从山顶出发去各个站点进行检 ...
- ASP.NET MVC开发微信(一)
public string index() { return Content(""); }
- Android系统下检测Wifi连接互联网是否正常的代码
/** * * 判断网络状态是否可用 * * @return true: 网络可用 ; false: 网络不可用 */ public boolean isConnectInternet ...
- 解决error C2059: 语法错误:“::”问题
错误代码提示: >f:\opencv\opencv\build\include\opencv2\flann\lsh_table.h(): error C2059: 语法错误:“::”f:\ope ...
- 哪项技术可以用在WEB开发中实现会话跟踪实现?
HTTP是“无状态”协议:客户程序每次读取 Web 页面,都打开到 Web 服务器的单独的连接,并且,服务器也不自动维护客户的上下文信息.即使那些支持持续性 HTTP 连接的服务器,尽管多个客户请求连 ...
- 华为OJ平台——统计字符串中的大写字母
题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可 ...
- Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)
Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.(本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,所 ...
- 【Hibernate 6】常用的hql语句以及N+1问题
HQL:Hibernate Query Language,是Hibernate框架中的查询语言,十分接近于SQL语言!以下介绍一些常用的Hql语句: 一.测试类 Classes类: <span ...
- sqlmap.config 配置
<?xml version="1.0" encoding="utf-8"?> <sqlMapConfig xmlns="http:/ ...
- 将Eclipse项目导入Android Studio出现中文乱码的问题
以前一直以Eclipse开发项目,最近正在研究Android Studio的使用,首先想到到的是将Eclispe项目导入AS. 可以方便查看以前写过的代码,然后出现了中文乱码的问题,通过搜索了一些资料 ...