(ssl2877)2017年东莞市信息学特长生测试题 摆渡线路

2017年东莞市信息学特长生测试题 摆渡线路

Description

某市的M公园中有一个近乎圆形的湖,有100个主要景点分布在湖边,为了方便游客,公园在一些景点之间开设了直通的摩托飞艇摆渡的项目一来减少游客在景点到景点之间所花的时间,二来也可以让游客体验一下惊险刺激的摩托飞艇。果然摩托飞艇摆渡项目大为成功,为了充分满足游客需要,摆渡线路越来越多。不料随着线路的增加,危险性也随之增加。如果两个摆渡线路之间有交叉(如上图),在这两个线路上的飞艇一旦发生碰撞,后果将不堪设想。

公园的管理层近日做出决定,本着安全第一的原则,在这个湖上取消一些线路,使剩下的任意两条线路在行驶阶段(即不考虑码头)不交叉。同时,考虑到经济效益,他们要求被取消的线路数最小,即保留尽量多的线路。他们希望你能够帮助他们算一算最多可以保留多少条线路。

Input

从文件line.in中读入数据,文件的第一行为N(1=

Output

将结果输出到文件line.out,文件只有一行,只有一个数,就是保留下来的线路的最多条数。

Sample Input

5
91 31
1 45
27 5
11 65
43 72

Sample Output

3

Source

题解:

   本题的思路是使用floyd来计算最大保留边,f[i,j]表示i区间到j区间内最大保留边,方程:f[i,j]:=max(f[i,k]+f[k,j]+a[i,j],f[i,j]);(a[i,j]为i,j之间是否存在边)
   我们从i开始枚举,用i+l,也就是j(l为len,是到下一个区间的距离)来更新各个点
   因为i到j区间不可能只有这两个点,故用k来枚举i~j的各个点
   最后在数组内找出最大保留边,并输出即可

PS:

   每个点都不可大于100(请看题目),故l,i,j,k都不能大于100,所以j和k操作时都要mod100,但如果是100 mod 100就是0,所以最后要+1

var
 a,f:array[1..101,1..101]of longint;
 n,x,y,i,j,k,l,ans:longint;
function max(a,b:longint):longint;
begin
 if a>b then exit(a);
 exit(b);
end;
begin
 read(n);
 for i:=1 to n do
  begin
   read(x,y);
   a[x,y]:=1;//无向图
   a[y,x]:=1;
  end;
 for l:=1 to 99 do//循环到100是多余的,(i+100)mod 100=i
  for i:=1 to 100 do
   begin
    k:=i;
    j:=(l+i-1)mod 100+1;
    while k<>j do//不能是同一个点,自己不能到自己
     begin
      f[i,j]:=max(f[i,k]+f[k,j]+a[i,j],f[i,j]);
      k:=k mod 100+1;
     end;
    ans:=max(ans,f[i,j]);
   end;
 write(ans);
end.

你可能感兴趣的:(竞赛(测试)题)