射击比赛 (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),请你编写程序找 ...
随机推荐
- POJ 3308 Paratroopers(最小割EK(邻接表&矩阵))
Description It is year 2500 A.D. and there is a terrible war between the forces of the Earth and the ...
- (转)Java DES 与Base64
原文地址http://blog.csdn.net/tomatozq/article/details/20773559 1,DES /** * 解密 * @param message * @param ...
- 【转】java内部类的作用
http://andy136566.iteye.com/blog/1061951/ 推荐一. 定义 放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不 ...
- java枚举使用
1.开发中如何使用枚举,一般在开发中使用消息提示.枚举可以继承,实现接口等.public enum Result { SUCCESS(1,"201 ok") { @Override ...
- AOP切入点注解报错
开始学习AOP,出现如下的错误,最后发现是JDK与aspectj,aspectjweaver版本问题造成的.之后改成最新版本,代码运行正常. 利用这些特性可以进行代码的插入,比如权限,缓存结合mecm ...
- OC基础(22)
NSMutableString基本概念 NSMutableString常用方法 NSMutableString练习 *:first-child { margin-top: 0 !important; ...
- MFC学习 标签页与属性页及各常用控件使用
参考 http://blog.csdn.net/anye3000/article/details/6700023 CTabCtrl: BOOL CTabTestDlg::OnInitDialog() ...
- python学习(一):环境安装及HelloWorld
一.安装注意事项: 在安装python的第三方库时,(平台是win)要 注意所下载的包的版本,一要与所安装的python版本相对应,同时还有注意操作系统的位数(32位还是64位).下载好后,先将c:\ ...
- js对象4-js原型--杂志
提问:在js中什么是原型 prototype 每个学js的人都有自己的解释,网上一大堆的解释与应用,但是看了他们的解释表示还是不理解怎么办?(原因是他们说的太天花乱坠了) 官方手册解释:prototy ...
- Do less things
就这样,选择做更少的事情,我觉得挺好,至少能睡得很踏实,吃饭很香,也不会觉得难受! 就这样,节制自己的欲望,但是却能很平静,安安静静走自己的路,我觉得生活有希望,也有快乐! 早上,已经可以八点十分起床 ...