pascal求解,并说说各题原理。

卡片重排
问题描述
可可共有两种卡片,一种卡片是数字0~9编号,一种卡片是字母A~Z编号,现在两种卡片混在一起,可可想将它们归类摆放,但是要求同类卡片中,它们相对位置不可以改变,原先在前的仍然在前,具体规则还可参考样例理解。
输入格式
一行,若干数字及字母,中间无空格。
输出格式
一行,字母在前编号,数字在后,中间无空格.
输入样例
123AB321
输出样例
AB123321
数据范围
卡片张数不超过255

卡片求和
问题描述
可可与小伙伴们玩一种卡片游戏,卡片在桌子上一字排开,共有n张,卡片上都有编号,游戏要求以最快速度,找出相邻的k张卡片,使其编号之和最大。
输入格式
两行。
第1行,2个正整数n和k。
第2行,n个正整数,表示各卡片的编号。
输出格式
1个正整数,表示最大的相邻的k张编号和。。
输入样例
20 4
5 20 1 18 4 16 6 10 15 2 17 3 14 7 13 8 11 19 9 12
输出样例
51
数据范围
K<n<=1000

卡片整理
问题描述
可可手头有很多游戏卡片,卡片上都有编号,这些卡片有些是重复的,他想将重复的卡片只留一张,其余的都处理掉,并且将剩下的卡片按编号从小到大排好,当然他还想知道剩下来的卡片数量。
输入格式
两行。
第1行,1个正整数n。
第2行,n个正整数ai,两数之间有一个空格隔开,表示卡片的编号。
输出格式
两行。
第1行,剩余卡片从小到大排列的卡片编号。
第1行,1个正整数,表示去掉重复卡片之后剩余编号各不相同的卡片数量。
输入样例
8
8 5 5 1 6 7 6 8
输出样例
5
1 5 6 7 8
数据范围
n<=2000000,ai<=1000

卡片覆盖
问题描述
可可与小伙伴玩一种卡片覆盖游戏。地面上有2×n的长方形区域,现在需要用2×1的卡片覆盖,他们想知道有多少种覆盖的方案。比如n=3时,共有3种覆盖方案。

输入格式
一个整数n。
输出格式
一个整数,表示覆盖长方形区域的方案数。
输入样例
3
输出样例
3
数据范围
1<=N<=1000

//P1
var sa,s1,st:string;
    i:integer;
begin
        readln(st);//读入全部卡牌
        for i:=1 to length(st) do//从头扫描
        begin
                if (ord(st[i])>=ord('0')) and (ord(st[i])<=ord('9')) then//是数字
                        insert(st[i],s1,length(s1)+1)//加入数字堆中
                else
                        insert(st[i],sa,length(sa)+1);//加入字母堆中
        end;
        write(sa);
        write(s1);
end.

//P2
var ar:array[1..1010]of longint;
    ans,n,i,k,tmp:longint;
begin
        read(n,k);
        for i:=1 to n do read(ar[i]);
        tmp:=0;
        for i:=1 to k do tmp:=tmp+ar[i];//算出a[1]+a[2]+...+a[k]
        ans:=tmp;
        for i:=k+1 to n do//枚举所有的长度为k的段,以i为结尾
        begin
                tmp:=tmp-ar[i-k]+ar[i];//算出这一段的和
                if tmp>ans then ans:=tmp;//更新答案
        end;
        writeln(ans);
end.

 

//p3
var a:array[0..1010]of longint;
    n,i,t:longint;
begin
        read(n);
        fillchar(a,sizeof(a),0);
        for i:=1 to n do
        begin
                read(t);
                inc(a[t]);
        end;//这个。。。不好说啊。。。名字叫计数排序。。。
        t:=0;
        for i:=0 to 1000 do
                if a[i]<>0 then inc(t);
        writeln(t);
        for i:=0 to 1000 do
                if a[i]<>0 then write(i,' ');
end.

//P4
//题目要求的是第n+1个斐波那契数f[n+1]:f[1]=1,f[2]=1,f[n]=f[n-1]+f[n-2]
//证明:n=1:1种:-
//n=2:2种:||或_
//             -
//如果第n行放一个|那么必须放2个|(||),然后第n-1行什么都不能放
//前n-2行可以随便放,有f[n-2]种方案
//如果放一个-,那么就不能放别的了,前n-1行可以随便放,有f[n-1]种方案
//综上所述:f[n]=f[n-1]+f[n-2]
//这个程序只能求到第90个左右,再多就要写高精度或者用python写
var a1,a2,a3,t:qword;
    n,i:integer;
begin
        read(n);
        a1:=0;a2:=0;a3:=1;
        for i:=1 to n do
        begin
                t:=a1;a1:=a2;a2:=a3;a3:=a1+a2;
        end;
        write(a3);
end.

//p4:python

a=1
b=0
c=0
d=input()
shit=0
while shit<=d:
    c=b
    b=b+a
    a=c
    shit=shit+1
print b

追问

谢谢,第四题我还是有点不太明白,您能说得更详细些吗?
还有,第四题如果用高精度做应该怎么办?
不好意思,我是初学者,麻烦您了!

追答

这个。。。。。。确实初学者会弄不明白。。。。。。但是我也不大会讲。。。。。。特别是打字。。。。。。只能达到上面的效果了。。。。。。您有可能的话问老师吧。。。。。。

附图一张,希望有帮助。。。。。。

温馨提示:答案为网友推荐,仅供参考
相似回答