解題報告 The Rabbits

2022-06-04 02:30:09 字數 2304 閱讀 9400

眾所周知,除了青蛙會跳之外,兔紙也會。

在一片n*m的菜地中,有一些兔紙在活動,每只兔紙可以在菜地中跳來跳去。但是有一些限制條件:

兔紙只能從菜地外跳進菜地內,並且最後一定要跳出去,每只兔紙跳的每步都是等方向、等長的;兔紙在菜地內至少踩到三個點。

這樣每只兔紙就在菜地裡留下了一條路徑。現在告訴你菜地中那些被兔紙踩過(乙個點可能被踩不止一次),某人決定捉住乙隻踩壞菜地塊數最多的兔紙懲罰他,來殺一儆百。

第一行兩個整數n,m(1<=n,m<=5000)

第二行乙個整數q被踩的點的個數(3<=q<=5 000);

接下來q行每行表示被踩點的橫縱座標。

踩壞菜地最多的兔紙踩壞的菜地數。

6 714

2 16 6

4 22 5

2 62 7

3 46 1

6 22 3

6 36 4

6 56 7

7其實這個題,最重要的是理解題意。

它的意思是,兔子每一步的步長不定,當每一步都得踩在給出的某乙個點上。並且,每乙隻兔子都跳得是直線,也就是說,在這條直線上,每兩個點(要求是已給出的某個點)之間距離相等。

注意一點,兔子只踩給出的點,而且一條直線上至少有三個點。

然後他的演算法很簡單,就是列舉,列舉這條直線的開頭的兩個點。

每次列舉出兩個點,看這兩個點能不能作為開頭的點,也就是說,這兩個點所連成的直線上,所有距離相等(為這兩個點之間的距離)得點,都是給出的點,並且列舉出的第乙個點是開頭第乙個點(如果不是,就說明這種直線會在後面列舉到,在這裡先不用考慮),也就是說,這個點沿直線再往前追溯單位個距離,就一定會出給定的矩形,然後統計這個直線上的距離相等的點,更新答案。

注意,可以更新答案的直線上,各個被踩出的點的距離一定相等,並且第乙個點沿直線向前追溯這距離和最後乙個點沿直線向後追溯這距離,都一定會出了給定的矩形的範圍。

** zsz

program rabbits;

var map:array[0..5000,0..5000] of boolean;

l,h:array[0..10000] of longint;

n,m,i,j,num,sth,stl,lenl,lenh,q,max:longint;

begin

assign(input,'frog.in');reset(input);

assign(output,'frog.out');rewrite(output);

readln(n,m);

readln(q);

fillchar(map,sizeof(map),false);

for i:=1 to q do

begin

readln(h[i],l[i]);

map[h[i],l[i]]:=true;

end;

for i:= 1 to q do

for j:= 1 to q do

if i<>j then

begin

lenh:=h[j]-h[i];

lenl:=l[j]-l[i];

if (h[i]-lenh>0)and(l[i]-lenl>0)and(h[i]-lenh<=n)and(l[i]-lenl<=m) then continue;

//如果第乙個點往前追溯這距離出不了矩形範圍,剪枝

sth:=h[j];

stl:=l[j];

num:=2;

if (lenh+sth>n)or(lenh+sth<=0)or(lenl+stl>m)or(lenl+stl<=0) then continue;

//如果最後乙個點向後追溯這距離就會出了矩形範圍,也就是說,這條直線上只有兩個點被踩,剪枝

while (map[lenh+sth][lenl+stl]=true) do

begin

inc(num);

sth:=lenh+sth;

stl:=lenl+stl;

//跳。。。

if (lenh+sth>n)or(lenh+sth<=0)or(lenl+stl>m)or(lenl+stl<=0) then break;

//跳出了矩形範圍

end;

if (sth+lenh>n)or(stl+lenl>m)or(sth+lenh<=0)or(stl+lenl<=0) then

if (num>=3)and(num>max) then max:=num;

//如果踩著給出的點可以跳出矩形範圍,就更新答案。

end;

writeln(max);

close(input);

close(output);

end.

Block Voting 解題報告

這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...

Safebreaker 解題報告

又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...

路由 解題報告

路由 問題描述 有乙個tcp ip網路 每台計算機都有乙個或多個網路介面。每個介面根據它的ip位址和子網掩碼來識別 即兩個4位元組的數,兩個字 節之間有乙個 號.子網掩碼有乙個二進位制表示法 有k個 1 然 後是 m 個 0 k m 8 4 32 如 212.220.35.77 是乙個 ip 地 址...