您的位置:首页 > 其它

2017.03.10【NOIP 普及组】模拟赛C组 三条直线Three lines 题解

2017-03-17 18:56 513 查看

原题:

http://172.16.0.132/junior/#contest/show/1375/0

题目描述:

FJ想使用购买的新监控系统监视他的N头奶牛(1 <=N<= 50,000)。

第i头牛位置在(x_i, y_i),这是一对整数坐标,范围在0…1,000,000,000之内。FJ的监控系统有3个特殊的镜头,每一个镜头能够观察垂直或者水平的一行。

请决定FJ是否有可能架设这3个镜头,使他能够观察到所有的N头牛。也就是说,请决定N头牛的位置是否能同时被3条直线所覆盖。这3条直线必须是垂直或者水平的。

输入:

第1行:1个整数N

第2..N+1行:2个整数x_i和y_i,表示第i头牛的坐标

输出:

第1行:如果能监控所有的N头牛,则输出1,否则输出0

样例输入:

6

1 7

0 0

1 2

2 0

1 4

3 4

样例输出:

1

分析:

爆搜······

实现:

type
arr=array[1..5,1..2] of longint;
var
w:arr;
n,i,j:longint;
s:array[0..50007,1..2] of longint;
function check(l,x:longint;w:arr):boolean;
var
i:longint;
begin
for i:=1 to l-1 do
if ((w[i,1]=1) and (w[i,2]=s[x,1])) or ((w[i,1]=2) and (w[i,2]=s[x,2])) then exit(true);
exit(false);
end;
function get(l,x:longint;w:arr):longint;
var
i,j:longint;
bz:boolean;
begin
for j:=x to n do
begin
bz:=false;
for i:=1 to l-1 do
if ((w[i,1]=1) and (w[i,2]=s[j,1])) or ((w[i,1]=2) and (w[i,2]=s[j,2])) then
begin
bz:=true;
break;
end;
if not bz then exit(j);
end;
exit(n+1);
end;
procedure dg(l,x:longint;w:arr);
var
ww:arr;
begin
if (x>n) then
if (l<=4) then
begin
writeln(1);
close(input);close(output);
halt;
end
else exit;
if l>4 then exit;
if check(l,x,w) then dg(l,get(l,x+1,w),w)
else
begin
ww:=w;
ww[l,1]:=1;
ww[l,2]:=s[x,1];
dg(l+1,x+1,ww);
ww:=w;
ww[l,1]:=2;
ww[l,2]:=s[x,2];
dg(l+1,x+1,ww);
end;
end;
begin
assign(input,'3lines.in');reset(input);
assign(output,'3lines.out');rewrite(output);
readln(n);
for i:=1 to n do readln(s[i,1],s[i,2]);
dg(1,1,w);
writeln(0);
close(input);close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: