洛谷P3955 图书管理员(NOIP2017 pjT2)

再现P党福利

//不得不说,代码真长    心累。
//考场上硬着头皮写下来

我敢说,下面没有一个人用我这种方法(字符串)做的。

因为。。考试的时候。。。看错题了。。。and then?以为图书编码的长度不超过20位

心痛

不过考虑周全就好

没啥坑点

个人认为考点:

快排(注意字符串的比较方法)

耐力&毅力(因为程序很长)

好吧我承认第二条是凑数的

附上考试源程序

AC100分(测试时请去掉文件输入输出,谢谢)

//准考证号 AH-0919
//防伪标志
var
n,q,i,t,j:longint;
c:char;
r:string;
a:array[-1..1000] of string;
p:array[1..1000] of longint;
procedure qsort(l,r:longint);//快排
var
i,j:longint;
mid,tmp:string;
begin
i:=l;
j:=r; 
mid:=a[(l+r) div 2];
while i<=j do
    begin
        while (length(a[i])<length(mid)) or (length(a[i])=length(mid)) and (a[i]<mid) do inc(i);//注意比较的方法,先比长度再比字符串的大小
        while (length(a[j])>length(mid)) or (length(a[j])=length(mid)) and (a[j]>mid) do dec(j);//同上
        if i<=j then
            begin
                a[0]:=a[i];
                a[i]:=a[j];
                a[j]:=a[0];
                inc(i); dec(j);
            end;
    end;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
    end;
function cmp(s1,s2:string):boolean;//比较 图书编码是不是以需求码结尾?
    var
        i:longint;
begin
if length(s1)<length(s2) then exit(false);
for i:=1 to length(s2) do
    if s1[length(s1)-i+1]<>s2[length(s2)-i+1] then
            exit(false);
            exit(true);
end;
begin
assign(input,'librarian.in'); reset(input);
assign(output,'librarian.out'); rewrite(output);
readln(n,q);
for i:=1 to n do
    readln(a[i]);//读入 图书编码
qsort(1,n);
for i:=1 to q do
    p[i]:=-1;//先都默认为找不到对应的图书编码
for i:=1 to q do
    begin
        read(t);
        read(c);//由于空格的原因,so。。。
        readln(r);//需求码
        for j:=1 to n do
            if cmp(a[j],r) then
            begin
                p[i]:=j;//如果找到了,标记位置
                break;
            end;
end;
a[-1]:='-1';//如果找不到对应的图书编码,输出-1
for i:=1 to q-1 do
    writeln(a[p[i]]);//如果找到相应的图书编码,输出编码;如果找不到,输出-1(想想是为什么)
write(a[p[q]]);//同上
//注意:我在这里不换号(也可以,因为过滤行末空格),大家noip千万别这样作死,不然。。。
close(input); close(output);
end.

猜你喜欢

转载自www.cnblogs.com/iycc/p/9069209.html
今日推荐