题目描述 ftiasch 和nm 是好朋友。nm 的成绩很差,以至于GPA(平均绩点)在系内倒数。系内一共有N 位 同学,每位同学有自己的GPA,以及已修学分数,定义GPT = GPA 已修学分数。ftiasch 为了帮助 nm 提高成绩,给nm 提了一个要求:新学期的GPA 要超过系内排名第K 位的同学。 为了帮助理解,给出一个例子: 现在给出系里面每位同学的GPT(只有一位小数),以及他们的已修学分。你需要帮助nm 把排名 第K 位的同学的GPA 求出来。 输入 第1 行,2 个整数N, K。第2 (N + 1) 行,每行1 个非负实数和1 个整数,分别表示GPT 和已 修学分数,注意所有同学的学分都在[1; 250] 的范围。 输出 第1 行,1 个实数,表示排名第K 同学的GPA,保留2 位小数输出。 样例输入 5 3 73 20 79.8 21 72.6 22 85.1 23 65.7 18 样例输出 3.65 数据范围限制 提示 数据范围 • 对于50% 的数据,1 N 100。 • 对于100% 的数据,1 K N 100; 000,GPT 小数点后至多1 位,GPA 至多4:0。 题意 从大到小排序,排GPA,输出第k大的GPA。 分析 先把GPA算出来, 再用快排排序,最后输出a[k]。 程序: var n,k,i:longint; a,b:real; w:array[0..100000]of real; procedure kp(l,r:longint); var i,j:longint; mid:real; begin if l>=r then exit; i:=l;j:=r;mid:=w[(l+r) div 2]; repeat while w[i]>mid do inc(i); while w[j]<mid do dec(j); if i<=j then begin w[0]:=w[i];w[i]:=w[j];w[j]:=w[0]; inc(i);dec(j); end; until i>j; kp(l,j); kp(i,r); end; begin readln(n,k); for i:=1 to n do begin readln(a,b); w[i]:=a/b; end; kp(1,n); write(w[k]:0:2); end.