2009东莞市特长生测试题

一、惊人的记忆力

问题描述:

希望中学的小明非常聪明,记忆力非常的好,可以达到过目不忘的程度,你任意给他一列数,他可以很快的按从小到大的顺序说出来。现在小A为了考考小明,任意给小明两列数,要求他将这两个数列中的数合并成一个数列,按从小到大的顺序说出这些数,相同的数只保留一个。现在也请你编程序来解决这个问题。

数据输入:

从文件a.in中读入数据,第一行是一个正整数N,表示第一个数列有N个整数,第二行是第一个数列的N个整数,第三行是一个正整数M,表示第二个数列有M个整数,第四行是第二个数列的M个整数。

数据输出:

结果输出到a.out中,只有一行,就是这两个数列的数合并成一个数列后按从小到大输出的结果,相同的数只输出一次。

输入输出样例

输入

5

12     17  19 34  20

7

19     30  12 50  20  55  17

输出

12 17  19  20 30  34  50  55

数据范围

1=< N,M <= 10000, 两个数列中的数x都是整数,且符合条件: -1000 = < x <=1000

思路:

简单排序...

var
 a:array[-3001..3001] of boolean;
 i,j,n,k,l,m,x:longint;
begin
 readln(n);
 for i:=1 to n do
 begin
  read(x);
  a[x]:=true;
 end;
 readln;
 readln(m);
 for i:=1 to m do
 begin
  read(x);
  a[x]:=true;
 end;
 for i:=-1001 to 1001  do
  if a[i]=true then write(i,' ');
end.

二、岛屿的缘分

问题描述:

人和人的相识是一种缘分,其实人有幸到某地也是一种缘分。某风景优美的K小岛的缘分和其他景点的缘分来得不一般,K岛上有一个石碑刻上了两个很大很大的整数x和y,和一个正整数K,后面写道:“谁能准确的写出x和y的乘积中最右边的k位数(如果乘积不足K位则在左边用“0”补足K位),他就是和K小岛有缘分的人”,李先生到了K小岛,他马上叫他的秘书算一算,写出x和y的乘积中最右边的k位数,看看李先生和他的秘书是否和K小岛有缘分。现在也请你完成这个工作(注意: 如果乘积不足K位则在左边用“0”补足K位)。

数据输入:

从文件b.in读入数据,文件中共有三行,第一行是一个位数不大于120的正整数x,第二行是一个位数不大于120的正整数y,第三行是一个正整数K(1=<K<=250)。

数据输出:

  结果输出到文件b.out中,只有一行,就是x和y的乘积中最右边的k位数。

输入输出样例1:

b.in

30

60

3

b.out

800

输入输出样例2:

b.in

12

13

5

b.out

00156

思路:

高精度乘法...改崩溃不知哪里错不放了...


三、导游的魔棒

问题描述:

小C“五一”节参加了五星旅行社组织的一次外出旅游,这次旅游中,小C遇到一件非常有趣的事: 五星旅行社的导游小张有一根魔棒,这根魔棒在每一次的旅游中可以产生一次魔力(也只能产生一次魔力),这魔力可以使两个景点间的距离减成原来的一半。小C在“五一”节的这次旅游中,很有幸是小张导游作为他们的导游,小张当然也没有忘记带他的魔棒,因为他可以发挥魔棒的作用,使路程减少呢。这次旅游中,去了一个有N个景点的旅游区,这个旅游区只有一个入口,在景点编号为1的地方,一个出口,在景点编号为N的地方,景点编号为1,2,3,…,N。在入口处有一个N×N的数据阵,描述了景点间的距离,a[I,j]表示景点i到景点j的距离。因为小C的公司有急事要小C尽快回来,现在小C要用张导游的魔棒,使得从入口到出口的距离最短。现在我们也来编一个程序:求将哪一条边减半后使从顶点1到顶点N的最短路径长度最短,输出这个最短距离,如果找不到从1到N的路径,则输出 -1 。

数据输入:

从文件中c.in读入数据,文件第一行是一个正整数N(3 ≤ N ≤ 50),表示共有N个点,接下来是一个N行N列的数据阵,a[I,j]的值表示顶点i到顶点j的长度。

 

数据输出:

只有一个数就是将一条边长减半后的从1到N的最短路径长度,结果四舍五入到小数后两位,如果找不到从1到N的路径,则输出 -1 。

 

输入输出样例

c.in

c.out

3

0  5  20

5  0  8

20  8  0

9.00

思路:

最短路,用多一个数组记录当前是否使用魔法棒就可以了。

var
 a:array[0..51,0..51,0..2] of double;
 i,j,n,m,k,l,x:longint;

function min(a,b:double):double;
begin
 if a>b then exit(b)
        else exit(a);
end;

begin
 readln(n);
 for i:=1 to n do
  begin
   for j:=1 to n do
   begin
    read(x);
    if x<>0 then
    begin
    a[i,j,1]:=x;
    a[i,j,0]:=x/2;
    end
    else begin
         a[i,j,1]:=2333333;
         a[i,j,0]:=2333333;
         end;
   end;
   readln;
  end;
 for i:=1 to n do
  for j:=1 to n do
   for k:=1 to n do
    if (i<>j)and(i<>k)and(j<>k) then
     begin
     a[i,j,1]:=min(a[i,j,1],a[j,k,1]+a[i,k,1]);
     a[i,j,0]:=min(a[i,j,0],a[j,k,1]+a[i,k,0]);
     a[i,j,0]:=min(a[i,j,0],a[j,k,0]+a[i,k,1]);
     end;
  if a[1,n,0]<>2333333 then writeln(a[1,n,0]:0:2)
                       else writeln('-1');
end.

四、开发区规划

问题描述:

    小王是D市主管经济的副市长,由于经济发展的需要,要在D市组建一个高新技术开发区,经过研究,规划局在D市的东部划出了一块土地作为开发区选址。这块土地是一块矩形平原,小王准备在上面修建一些建筑。为了规划方便,他将矩形划分成N*M格。棘手的是,这块土地有些历史文化遗址散布在某些格子内,这些历史文化遗址是万万不能拆除的,否则将激起民愤,小王深知这一点,因此,他的新建筑在选址时要避开这些格子。

  假设新的建筑物有P种规格,每种建筑物都是正方形的,占地为Ti*Ti格(1<=i<=P)。小王想知道对于每种规格的建筑,有多少种不同的合适选址方案(一种合适的选址方案指的是在该建筑所占的正方形区域内不存在有历史文化遗址的格子)。现在请你来当小王的秘书帮他完成这个光荣而艰巨的任务。

数据输入:

  从文件d.in读入数据,输入文件第一行包含三个数,分别代表N,M,P (1<=N,M<=2000,1<=P<=1000)。随后的n行,每行有m个0或1(1表示该格为空地,0表示该格有历史文化遗址)。接下来的P行每行有一个整数Ti (1<Ti<=max(M,N)),代表的第i种建筑物的边长。

数据输出:

  结果输出到文件d.out中,共有P行,每行一个整数,第i行的数代表边长为Ti的建筑物选址方案数。

输入输出样例

d.in

4 4 2

1011

1111

1110

1110

2

3

d.out

5

1

思路:

做一个记录a[i,j]为右下角能向左和上伸展最大的正方形表格,加起来就好。


var
 a:array[0..2001] of ansistring;
 map:array[0..2001,0..2001] of longint;
 ans:array[0..2001] of longint;
 i,j,k,l,n,m,anss,x,max:longint;

function work(i,j:longint):longint;
 var
 k,min:longint;
begin
 min:=1000000;
 if a[i,j]='0' then exit(-1);
 if (i-1<=0)or(j-1<=0) then exit(0);
 if map[i-1,j-1]<map[i-1,j] then min:=map[i-1,j-1]
                        else min:=map[i-1,j];
 if min>map[i,j-1] then min:=map[i,j-1];
 work:=min;
end;

begin
 readln(n,m,k);
 for i:=1 to n do
  begin
  readln(a[i]);
   for j:=1 to m do
    begin
     map[i,j]:=work(i,j)+1;
     if map[i,j]>max then max:=map[i,j];
     inc(ans[map[i,j]]);
    end;
  end;
 for i:=1 to k do
  begin
   readln(x);
   anss:=0;
   for j:=x to max do
    anss:=ans[j]+anss;
   writeln(anss);
  end;
end.



猜你喜欢

转载自blog.csdn.net/g2523054231/article/details/79672057