一、惊人的记忆力
提交文件: a.pas / a.exe
输入文件: a.in
输出文件: a.out
问题描述:
希望中学的小明非常聪明,记忆力非常的好,可以达到过目不忘的程度,你任意给他一列数,他可以很快的按从小到大的顺序说出来。现在小A为了考考小明,任意给小明两列数,要求他将这两个数列中的数合并成一个数列,按从小到大的顺序说出这些数,相同的数只保留一个。现在也请你编程序来解决这个问题。
数据输入:
从文件a.in中读入数据,第一行是一个正整数N,表示第一个数列有N个整数,第二行是第一个数列的N个整数,第三行是一个正整数M,表示第二个数列有M个整数,第四行是第二个数列的M个整数。
数据输出:
结果输出到a.out中,只有一行,就是这两个数列的数合并成一个数列后按从小到大输出的结果,相同的数只输出一次。
输入输出样例
a.in
5
12 17 19 34 20
7
19 30 12 50 20 55 17
a.out
12 17 19 20 30 34 50 55
数据范围
1=< N,M <= 10000, 两个数列中的数x都是整数,且符合条件: -1000 = < x <=1000
(大水题)
var
f:array[-1000..1000]of boolean;
i,j,n,m,x:longint;
begin
fillchar(f,sizeof(f),false);
read(n);
for i:=1 to n do begin
read(x);
if not f[x] then f[x]:=true;
end;
read(n);
for i:=1 to n do begin
read(x);
if not f[x] then f[x]:=true;
end;
for i:=-1000 to 1000 do if f[i] then write(i,' ');
end.
一、岛屿的缘分
提交文件: b.pas / b.exe
输入文件: b.in
输出文件: b.out
问题描述:
人和人的相识是一种缘分,其实人有幸到某地也是一种缘分。某风景优美的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= 数据输出: 结果输出到文件b.out中,只有一行,就是x和y的乘积中最右边的k位数。 输入输出样例1: b.in 30 60 3 b.out 800 输入输出样例2: b.in 12 13 5 b.out 00156 细心就好,没什么。 2009年东莞市信息学特长生测试题 导游的魔棒 Time Limit:10000MS Memory Limit:65536K Description 小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 。 Input 从文件中c.in读入数据,文件第一行是一个正整数N(3 ≤ N ≤ 50),表示共有N个点,接下来是一个N行N列的数据阵,a[I,j]的值表示顶点i到顶点j的长度。 Output 只有一个数就是将一条边长减半后的从1到N的最短路径长度,结果四舍五入到小数后两位,如果找不到从1到N的路径,则输出 -1 。 Sample Input
Sample Output
Source elba 弗洛伊德算法可以解决问题,根据题意我们也就可以知道,一共有三种情况,1、不需要使用魔法就可以走出最短路。2、只需要折上一条路就可以解决问题,找到最短的路径。3、要折下一条边才可以找到最短路。预处理也简单了,这题是LZXdalao教的,其实也就是要记录关于某点某边的两种情况:不折f[i,j,0];折f[i,j,1]:=/2。 PS://为什么fillchar会过不了。 2009年东莞市信息学特长生测试题 开发区规划 Time Limit:10000MS Memory Limit:65536K Description 小王是D市主管经济的副市长,由于经济发展的需要,要在D市组建一个高新技术开发区,经过研究,规划局在D市的东部划出了一块土地作为开发区选址。这块土地是一块矩形平原,小王准备在上面修建一些建筑。为了规划方便,他将矩形划分成N*M格。棘手的是,这块土地有些历史文化遗址散布在某些格子内,这些历史文化遗址是万万不能拆除的,否则将激起民愤,小王深知这一点,因此,他的新建筑在选址时要避开这些格子。 Input 从文件d.in读入数据,输入文件第一行包含三个数,分别代表N,M,P (1<=N,M<=2000,1<=P<=1000)。随后的n行,每行有m个0或1(1表示该格为空地,0表示该格有历史文化遗址)。接下来的P行每行有一个整数Ti (1 Output 结果输出到文件d.out中,共有P行,每行一个整数,第i行的数代表边长为Ti的建筑物选址方案数。 Sample Input
Sample Output
思路:本题可以暴力30分哦,TLE枚举显然不可能是正解。 我们可以把这个地区当做一个棋盘,1的正方形肯定是可以随便放的(不考虑),我们求一个size,就按照这个size正方形的最右下角往周围扩张,求最大的形状,最上一行和最左一列不可能扩张比1大的size,所以这里我们又不考虑i=1和j=1。再把每一个可能有正方形的格子,都标记扩张后最大的size,和这个n*m棋盘中最大能存的size——max。最终输出要求size到max内所有符合的正方形的数量就好了。(会比其他解法慢,主要是先求了max)明明是秘书算的,为什么跟老板有缘var
s1,s2:ansistring;
a,b,c:array[1..5000] of integer;
l1,l2,l,i,j,k,x:integer;
begin
readln(s1);
readln(s2);
read(k);
l1:=length(s1);
l2:=length(s2);
for i:=1 to l1 do
a[l1-i+1]:=ord(s1[i])-48;
for i:=1 to l2 do
b[l2-i+1]:=ord(s2[i])-48;
for i:=1 to l1 do
begin
x:=0;
for j:=1 to l2 do
begin
c[i+j-1]:=c[i+j-1]+x+a[i]*b[j];
x:=c[i+j-1] div 10;
c[i+j-1]:=c[i+j-1]mod 10;
end;
c[i+j]:=x;
end;
l:=l1+l2;
while (c[l]=0)and(l>1) do dec(l);
if l
我才不会告诉你我不细心才写错了
Total Submit:93 Accepted:30
Case Time Limit:1000MS3
0 5 20
5 0 8
20 8 0
9.00
var
f:array[0..50,0..50,0..1]of double;
i,j,k,n,p:longint;
function min(a,b:double):double;
begin
if a0 then begin
f[i,j,0]:=p;
f[i,j,1]:=p/2;
end;
end;
readln;
end;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
begin
f[i,j,0]:=min(f[i,j,0],f[i,k,0]+f[k,j,0]);
f[i,j,1]:=min(f[i,j,1],f[i,k,1]+f[k,j,0]);
f[i,j,1]:=min(f[i,j,1],f[i,k,0]+f[k,j,1])
end;
if f[1,n,1]=23333333 then write('-1')
else write(f[1,n,1]:0:2);
end.
Total Submit:129 Accepted:61
Case Time Limit:1000MS
假设新的建筑物有P种规格,每种建筑物都是正方形的,占地为Ti*Ti格 (1<=i<=P)。小王想知道对于每种规格的建筑,有多少种不同的合适选址方案(一种合适的选址方案指的是在该建筑所占的正方形区域内不存在有历史文化遗址的格子)。现在请你来当小王的秘书 帮他完成这个光荣而艰巨的任务。 4 4 2
1011
1111
1110
1110
2
3
5
1
var
s:array[0..3001]of ansistring;
a:array[0..3001,0..3001] of longint;
ans:array[0..3001]of longint;
i,j,k,n,m,p,max,x:longint;
function min(a,b,c:longint):longint;
begin
if (a<=b)and(a<=c)then exit(a);
if (b<=a)and(b<=c)then exit(b);
if (c<=a)and(c<=b)then exit(c);
end;
begin
//assign(input,'data.in');
//reset(input);
readln(n,m,p);
for i:=1 to n do begin
readln(s[i]);
for j:=1 to m do
begin
if (i=1)or(j=1) then a[i,j]:=ord(s[i,j])-48
else
if s[i,j]='1' then
a[i,j]:=min(a[i-1,j],a[i,j-1],a[i-1,j-1])+1;
inc(ans[a[i,j]]);
if a[i,j]>max then max:=a[i,j];
end;
end;
for i:=1 to p do
begin
x:=0;
readln(k);
for j:=k to max do x:=x+ans[j];
writeln(x);
end;
end.