16年特长生(广东东莞)

前言:这套题做得我有点心态崩,好怕过不了啊

 

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值