前言:这套题做得我有点心态崩,好怕过不了啊
2016东莞市特长生考试 子数整数
Time Limit:10000MS Memory Limit:256000K
Total Submit:38 Accepted:25
Case Time Limit:1000MS
Description
对于一个五位数 a1a2a3a4a5,可将其拆分为三个子数: sub1=a1a2a3
sub2=a2a3a4
sub3=a3a4a5
例如,五位数 20207 可以拆分成 sub1=202
sub2=020(=20) sub3=207
现在给定一个正整数 K,要求你编程求出 10000(包括 10000)到 30000(包括 30000)之间所有满足下述条件的五位数,条件是这些五位数的三个子数 sub1,sub2,sub3 都可被 K 整除。
Input
从文件 num.in 输入,输入仅一行,为正整数 K(0<k<1000)。< font="">
Output
输出到文件 num.out,输出文件的每一行为一个满足条件的五位数,要求从小到大输出。不得重复输出或遗漏。如果无解,则输出“-1”。
Sample Input
15
Sample Output
22555
25555
28555
30000
*
第一题这个就很水了,但是我还是WA了两个点,因为我没有判断没有数字符合的情况,也就是-1,这是个粗心的分吧……
var
s:string;
a1,a2,a3,a4,a5,s1,s2,s3:longint;
i,k,b:longint;
begin
read(k);
for i:=10000 to 30000 do
begin
str(i,s);
a1:=ord(s[1])-48;
a2:=ord(s[2])-48;
a3:=ord(s[3])-48;
a4:=ord(s[4])-48;
a5:=ord(s[5])-48;
s1:=a1*100+a2*10+a3;
s2:=a2*100+a3*10+a4;
s3:=a3*100+a4*10+a5;
if (s1 mod k=0)and(s2 mod k=0)and(s3 mod k=0)
then begin
writeln(i);
inc(b);end else continue;
end;
if b=0 then writeln('-1');
end.
2016东莞市特长生考试 游戏问题
Time Limit:10000MS Memory Limit:65536K
Total Submit:20 Accepted:14
Description
“五四”青年节到了,某学校要举行一个游园活动,其中有一个这样的游戏: n 个同学(编号从 0 到 n-1)围坐一圈,按照顺时针方向给 n 个位置编号,从0 到 n-1。最初,第 0 号同学在第 0 号位置,第 1 号同学在第 1 号位置,„„,
依此类推。
游戏规则如下:每一轮第 0 号位置上的同学顺时针走到第 m 号位置,第 1号位置同学走到第 m+1 号位置,„„,依此类推,第 n − m 号位置上的同学走到第 0 号位置,第 n-m+1 号位置上的同学走到第 1 号位置,„„,第 n-1 号位置上的同学顺时针走到第 m-1 号位置。
现在,一共进行了 10^k 轮,请问 x 号同学最后走到了第几号位置。
Input
从文件 game.in 读入数据,输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。
Output
结果输出到文件 game.out,输出共 1 行,包含 1 个整数,表示 10^k 轮后 x 号小伙伴所在的位置编号。
Sample Input
10 3 4 5
Sample Output
5
Hint
对于 30%的数据, 0 < ? < 7;
对于 80%的数据, 0 < ? < 10^7;
对于 100%的数据, 1 < n < 1,000,000,0 < m<n ,1="" <="x" ?="" <10^9<="" font="">
*
看其他同学十多行0分,我才三行骗了90,很舒服
这是满分AC(其实是90分)的方法,有点冒险,因为这道题不卡,所以能过(不然我30):
var
x,n,m,k,p,i,a:longint;
begin
read(n,m,k,x);
a:=1;
for i:=1 to k do a:=(a*10)mod n;
p:=(m mod n)*a+(x mod n);
write(p mod n);
end.
2016东莞市特长生考试 字串距离
Time Limit:10000MS Memory Limit:256000K
Total Submit:35 Accepted:19
Case Time Limit:1000MS
Description
设有字符串 X,我们称在 X 的头尾及中间插入任意多个空格后构成的新字符
串为 X 的扩展串,如字符串 X 为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd
□”和“abcb□cd□”都是 X 的扩展串,这里“□”代表空格字符。
如果 A1 是字符串 A 的扩展串,B1 是字符串 B 的扩展串,A1 与 B1 具有相
同的长度,那么我扪定义字符串 A1 与 B1 的距离为相应位置上的字符的距离总
和,而两个非空格字符的距离定义为它们的 ASCII 码的差的绝对值,而空格字
符与其他任意字符之间的距离为已知的定值 K,空格字符与空格字符的距离为 0。
在字符串 A、B 的所有扩展串中,必定存在两个等长的扩展串 A1、B1,使得 A1
与 B1 之间的距离达到最小,我们将这一距离定义为字符串 A、B 的距离。
请你写一个程序,求出字符串 A、B 的距离。
Input
从文件 blast.in 中读入数据,输入文件第一行为字符串 A,第二行为字符串 B。
A、B 均由小写字母组成且长度均不超过 2000。第三行为一个整数 K(1≤K≤100),
表示空格与其他字符的距离。
Output
输出到文件 blast.out 中,仅一行包含一个整数,表示所求得字符串 A、B 的距离。
Sample Input
cmc
snmn
2
Sample Output
10
思路:这是一道DP,对!是不是想跳过?我也是!然后还是要改的嘛。对于每一对,我们有三种情况:1、在a行加空格 2、在b行加空格 3、不加空格,相加减。按照三种情况分别比较。另外开始要有预处理:也就是给最前面的格子赋值常数k,即认为整行空格对整行有意义字符,价值为k。PS:本题其实不需要考虑空空是最优解和长度l1=l2。
var
a,b:ansistring;
i,j,k,l1,l2:longint;
n,m:array[0..2001] of longint;
f:array[0..2001,0..2001]of 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
readln(a);
readln(b);
read(k);
l1:=length(a);
l2:=length(b);
f[0,0]:=0;
for i:=1 to l1 do begin
n[i]:=ord(a[i]);
f[i,0]:=k+f[i-1,0];
end;
for j:=1 to l2 do begin
m[j]:=ord(b[j]);
f[0,j]:=k+f[0,j-1];
end;
for i:=1 to l1 do
for j:=1 to l2 do
begin
f[i,j]:=min(k+f[i-1,j],k+f[i,j-1],abs(n[i]-m[j])+f[i-1,j-1]);
end;
writeln(f[l1,l2]);
end.
2016东莞市特长生考试 村庄重建
Time Limit:10000MS Memory Limit:256000K
Total Submit:39 Accepted:20
Case Time Limit:1000MS
Description
B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。
给出 B 地区的村庄数 N,村庄编号从 0 到 N-1,和所有 M 条公路的长度,公路是双向的。并给出第 i 个村庄重建完成的时间 t[i],你可以认为是同时开始重建并在第 t[i]天重建完成,并且在当天即可通车。若 t[i]为 0 则说明地震未对此地区造成损坏,一开始就可以通车。之后有 Q 个询问(x, y, t),对于每个询问你要回答在第 t 天,从村庄 x 到村庄 y 的最短路径长度为多少。如果无法找到从 x 村庄到 y 村庄的路径,经过若干个已重建完成的村庄,或者村庄 x 或村庄 y 在第 t 天仍未重建完成 ,则需要返回-1。
Input
输入文件 rebuild.in 的第一行包含两个正整数 N,M,表示了村庄的数目与公路的条数。
第二行包含 N 个非负整数 t[0], t[1], „, t[N – 1],表示了每个村庄重建完成的时间,数据保证了 t[0] ≤ t[1] ≤ „ ≤ t[N – 1]。
接下来 M 行,每行 3 个非负整数 i, j, w,w 为不超过 10000 的正整数,表示了有一条连接村庄 i 与村庄 j 的道路,长度为 w,保证 i≠j,且对于任意一对村庄只会存在一条道路。
接下来一行也就是 M+3 行包含一个正整数 Q,表示 Q 个询问。
接下来 Q 行,每行 3 个非负整数 x, y, t,询问在第 t 天,从村庄 x 到村庄 y 的
最短路径长度为多少,数据保证了 t 是不下降的。
Output
输出文件 rebuild.out 包含 Q 行,对每一个询问(x, y, t)输出对应的答案,即在第 t 天,从村庄 x 到村庄 y 的最短路径长度为多少。如果在第 t 天无法找到从 x 村庄到 y 村庄的路径,经过若干个已重建完成的村庄,或者村庄 x 或村庄 y
在第 t 天仍未修复完成,则输出-1。
Sample Input
4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4
Sample Output
-1 -1 5 4
Hint
【数据说明】
对于 30%的数据,有 N≤50;
对于 30%的数据,有 t[i] = 0,其中有 20%的数据有 t[i] = 0 且 N>50;
对于 50%的数据,有 Q≤100;
对于 100%的数据,有 N≤200,M≤N*(N-1)/2,Q≤50000,所有输入数据涉及整数均不超过 100000
心态爆炸,自己看吧(别用maxlongint,用23333333,不然会WA,我改了一晚上/撇嘴)
var
f:array[0..2001,0..2001]of longint;
tt:array[0..2001]of longint;
i,j,k,l,n,m,x,y,t,q,w:longint;
function min(a,b:longint):longint;
begin
if a>b then exit(b);
exit(a);
end;
begin
read(n,m);
for i:=0 to n-1 do
for j:=0 to n-1 do
if i<>j then f[i,j]:=23333333;//用Max会炸
for i:=0 to n-1 do read(tt[i]);
for i:=0 to m-1 do begin
readln(x,y,w);
f[x,y]:=w;
f[y,x]:=w;
end;
readln(q);
l:=0;
t:=0;
for k:=1 to q do
begin
read(x,y,w);
while (l<n)and(tt[l]<=w) do inc(l);//枚举村庄,到达距离此时最进的修建完成时间
while (t<l) do//最短路,时间内,修好的村庄和其他村关联
begin
for i:=0 to n-1 do
for j:=0 to n-1 do
f[i,j]:=min(f[i,j],f[i,t]+f[t,j]);//Floyed
inc(t);//下一个村
end;
if (x>=l)or(y>=l)or(f[x,y]=23333333) then
writeln('-1')//如果其中一个村没修好,或者这条路不存在,则-1
else
writeln(f[x,y]);//否则正解
end;
end.