
Const
NN=7//NN的值
Type
Arr1=array[0..30] of char
var
s:arr1
k,p:integer
Function fun(s:arr1a:charn:integer):integer
var
j:integer
begin
j:=n{j被赋成7,指向数组末尾}
while (a<s[j])and(j>0) do dec(j){如果查找字母比s[j]这个字母小,就把j减1,循环直到查找字母比s[j]大或等于,或者j=0}
fun:=j{返回j的值}
end
begin
for k:=1 to NN do
s[k]:=chr(ord('A')+2*k+1){s[k]被赋成ASCII码为(字母A的ASCII码+2*k+1)的字母,执行完应是这样的 s=(D,F,H,J,L,N,P)}
k:=fun(s,'M',NN){利用函数查找M按字母表顺序排列应在s数组中的位置}
writeln(k){输出这一位置}
end.
const SIZE=10var
i,j,cnt,n,m:integerdata:array[1..SIZE] of integer
begin
readln(n,m)
for i:=1 to n do read(data[i])
for i:=1 to n do
begin
cnt:=0for j:=1 to n do if (data[i]<data[j]) or ((data[j]=data[i]) and (j<i)) then inc(cnt)
if cnt=m then writeln(data[i])
end
end.
首先5-6行读入数据
n=5, m=2, data[1]=96, data[2]=-8, data[3]=0, data[4]=16, data[5]=87
对于7-11行的循环
先看10行的条件 条件要求在data[i]<data[j] 或 (i<j 且 data[i]=data[j])
也就是data[i]与每个数比较 data[i]较小 或者相同时输入顺序靠前(与自己比较时不符合i<j)
于是到11行时 cnt表示 i=某值时 满足条件的个数
也就是说 当满足条件的个数=m时 输出data[i]
可以发现 data[i]为第m+1大的数
也就是输出 第m+1大的数 数字相同时输入顺序靠后的数被认为较大(当然了不会影响答案)
答案就是第3大的数 也就是16了
(不过我觉得像这种不太复杂的题直接全部代入数据一步一步想就差不多了)
P.S.我是新手 没考过竞赛 以上纯属个人思路
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)