# 26 条题解

• @ 2017-10-27 19:24:22

#include<stdio.h>
int ren[5005],fen[5005];
int main()
{
freopen("score.in","r",stdin);
freopen("score.out","w",stdout);
int n,m,i,j,t;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d %d",&ren[i],&fen[i]);
for(i=1;i<=n-1;i++) //冒泡排序
for(j=1;j<=n-i;j++)
if(fen[j]<fen[j+1]||
fen[j]==fen[j+1]&&ren[j]>ren[j+1])
{ // 分数和报名号一起交换
t=fen[j];fen[j]=fen[j+1];fen[j+1]=t;
t=ren[j];ren[j]=ren[j+1];ren[j+1]=t;
}
m=m+m/2; //计算人数

while(fen[m]==fen[m+1]) m++;//找出分数一样
printf("%d %d\n",fen[m],m);
for(i=1;i<=m;i++)
printf("%d %d\n",ren[i],fen[i]);
return 0;
}

• @ 2017-10-20 21:59:22

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct ss{
int k,s;
}s1[5001];
int cmp1(ss x,ss y)
{
if(x.s==y.s) return x.k<y.k;
else return x.s>y.s;
}
int main()
{
int n,m,a,f,sum=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s1[i].k>>s1[i].s;
}
a=floor(m*1.5);
sort(s1+1,s1+1+n,cmp1);
sort(s1+1,s1+n+1,cmp1);
s1[a].s;
cout<<s1[a].s<<" ";
for(int i=1;i<=n;i++)
{
if(s1[i].s>=s1[a].s)
sum++;
}
cout<<sum<<endl;
for(int i=1;i<=sum;i++)
{
cout<<s1[i].k<<" "<<s1[i].s<<endl;
}
return 0;
}

• @ 2018-02-06 10:13:45
``````#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int n, m, ans;
struct A {
int num;
int s;
}arr[10010];
bool cmp(A a,A b){
if(a.s==b.s) return a.num < b.num;
else return a.s > b.s;
}
int main(){
scanf("%d%d",&n,&m);
int num,sum;
for(int i=0; i<n; i++) {
scanf("%d%d",&num,&sum);
arr[i].num=num;
arr[i].s=sum;
}
sort(arr,arr+n,cmp);
int r = ((double) m * 1.5);
int brr=arr[r-1].s;
for(int i=0; i<n; i++) {
if(arr[i].s >= brr) ans++;
}
printf("%d %d\n",brr,ans);
for(int i=0; i<ans; i++)
printf("%d %d\n",arr[i].num,arr[i].s);
return 0;
}
``````
• @ 2017-04-15 12:42:28

#include<bits/stdc++.h>
using namespace std;
struct xs
{
int id,score;
}a[5005];
bool cmp(xs a,xs b)
{
if(a.score==b.score) return a.id<b.id;
else return a.score>b.score;
}
int main()
{
int n,m,i;
cin>>n>>m;
m=1.5*m;
for(i=1;i<=n;++i)
cin>>a[i].id>>a[i].score;
sort(a+1,a+n+1,cmp);
while(a[m].score==a[m+1].score) ++m;
cout<<a[m].score<<" "<<m<<endl;
for(i=1;i<=m;++i) cout<<a[i].id<<" "<<a[i].score<<endl;
return 0**;

• @ 2016-09-06 12:14:11
``````评测结果
编译成功

测试数据 #0: Accepted, time = 0 ms, mem = 596 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 596 KiB, score = 10
测试数据 #2: Accepted, time = 15 ms, mem = 596 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 596 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 596 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 596 KiB, score = 10
测试数据 #6: Accepted, time = 0 ms, mem = 596 KiB, score = 10
测试数据 #7: Accepted, time = 15 ms, mem = 596 KiB, score = 10
测试数据 #8: Accepted, time = 0 ms, mem = 600 KiB, score = 10
测试数据 #9: Accepted, time = 0 ms, mem = 596 KiB, score = 10
Accepted, time = 30 ms, mem = 600 KiB, score = 100
代码
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
struct Score {
int num,score;
}peole[5001];
inline bool cmp(Score x,Score y) {
if (x.score != y.score) return x.score > y.score;
return x.num < y.num;
}
int main() {
ios :: sync_with_stdio(false);
//ifstream cin("score.in",ios :: in);
//ofstream cout("score.out",ios :: out);
int n,m;
cin >> n >> m;
m = (int)(m*1.5);
for (int i = 1;i <= n;i++) cin >> peole[i].num >> peole[i].score;
sort(peole+1,peole+n+1,cmp);
int cnt = m;
while (peole[cnt].score == peole[m].score) cnt++;
cout << peole[m].score << ' ' << --cnt << '\n';
for (int i = 1;i <= cnt;i++) cout << peole[i].num << ' ' << peole[i].score << '\n';
return 0;
}
``````
• @ 2016-05-21 19:11:29

这个很好理解的，只是基础的模拟+排序。
var
n,m,num,i,j,t:longint;
a,b:array[1..100000] of longint;
begin
readln(n,m);
for i:=1 to n do begin
readln(a[i],b[i]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do begin
if b[i]<b[j] then begin
t:=b[i]; b[i]:=b[j]; b[j]:=t;
t:=a[i]; a[i]:=a[j]; a[j]:=t;
end;
end;
m:=trunc(m*1.5);
num:=0;
for i:=m to n do begin
if b[m]=b[i] then inc(num);
end;
m:=m+num-1;
writeln(b[m],' ',m);
for i:=1 to m-1 do
for j:=i+1 to m do begin
if b[i]=b[j] then begin
if a[i]>a[j] then begin
t:=a[i]; a[i]:=a[j]; a[j]:=t;
end;
end;
end;
for i:=1 to m do begin
writeln(a[i],' ',b[i]);
end;
end.

• @ 2015-08-26 13:50:19

var a,b,c,d,n,m:longint;
e:array[1..5000,1..2] of integer;

procedure f(var a,b:integer);
var c:integer;
begin
c:=a;
a:=b;
b:=c;
end;

begin
read(n,m);
for a:=1 to n do read(e[a,1],e[a,2]);

for a:=1 to n do
for b:=1 to n-1 do
begin
if (e[b,2]<e[b+1,2])or((e[b,2]=e[b+1,2])and(e[b,1]>e[b+1,1])) then
begin
f(e[b,1],e[b+1,1]);
f(e[b,2],e[b+1,2]);
end;
end;
m:=trunc(m*1.5);
for a:=m+1 to n do
if e[m,2]=e[a,2] then inc(m) else break;

writeln(e[m,2],' ',m);
for a:=1 to m do
writeln(e[a,1],' ',e[a,2]);
end.

• @ 2015-04-08 18:12:21

没必要快排。主要就是5000^2的时间复杂度。冒泡简单又方便。大不了可以标记优化下就行了。

首先是按2个条件排序，1是分数 2是号次（分数相同的考虑）

然后算出M，但是这个M不一定就是M*1.5，我们需要看看有没有同分。你需要看跟M名分数一样的有几个，M就+多少，这个很简单，自己去想怎么做吧。

然后输出第M名的分数和M。再从1到M依次出成绩即可。嗯，水题。快排反而可能会搞乱。

###block code
program P18132;
var m,n,i,j:longint;
data:array[1..5000,1..2] of longint;
procedure change(var a,b:longint);
var t:longint;
begin
t:=a; a:=b; b:=t;
end;

begin //main
read(n); read(m);
for i:=1 to n do begin read(data[i,1]); read(data[i,2]); end; //读入

for i:=1 to n do //冒泡不谢
for j:=1 to n-1 do
begin
if data[j,2]<data[j+1,2] then
begin
change(data[j,1],data[j+1,1]); change(data[j,2],data[j+1,2]);
end;

if (data[j,1]>data[j+1,1]) and (data[j,2]=data[j+1,2]) then
begin
change(data[j,1],data[j+1,1]); change(data[j,2],data[j+1,2]);
end;
end;

m:=trunc(m*1.5); //算M

for i:=m+1 to n do //修正M
if data[m,2]=data[i,2] then
inc(m)
else
break;

writeln(data[m,2],' ',m); //以下输出

for i:=1 to m do
writeln(data[i,1],' ',data[i,2]);

end.

• @ 2014-09-04 13:08:35

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct arr {
int x, y;

} a[5005];
bool cmp (arr x, arr y) {
if (x.y == y.y) return x.x < y.x;
return x.y > y.y;

}

int main()
{
int m,n,ans=0,num=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y;
sort (a+1, a + n + 1, cmp);
ans=int(1.5*m);
cout<<a[ans].y<<" ";
for(int i=1;i<=n;i++){
if(a[i].y>=a[ans].y)
num ++;
}
cout<<num<<endl;
for(int i=1;i<=num;i++)
//if(a[i].y>= a[ans].y)
cout<<a[i].x<<" "<<a[i].y<<endl;
return 0;
}

• @ 2013-12-08 14:07:20

评测结果
编译成功

测试数据 #0: Accepted, time = 0 ms, mem = 824 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 824 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 824 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 824 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 824 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 824 KiB, score = 10
测试数据 #6: Accepted, time = 15 ms, mem = 820 KiB, score = 10
测试数据 #7: Accepted, time = 62 ms, mem = 820 KiB, score = 10
测试数据 #8: Accepted, time = 140 ms, mem = 824 KiB, score = 10
测试数据 #9: Accepted, time = 0 ms, mem = 820 KiB, score = 10
Accepted, time = 217 ms, mem = 824 KiB, score = 100

### 代码

var
id,score:array[1..10000]of longint;
n,m,i,j,upscore,temp:longint;
begin
readln(n,m);
for i:=1 to n do
readln(id[i],score[i]);
for i:=1 to n do
for j:=i to n do
if (score[i]<score[j])or((score[i]=score[j])and(id[i]>id[j])) then
begin
temp:=score[i]; score[i]:=score[j]; score[j]:=temp;
temp:=id[i]; id[i]:=id[j]; id[j]:=temp;
end;
m:=m+m div 2;
upscore:=score[m];
while score[m]>=upscore do inc(m);
writeln(upscore,' ',m-1);
for i:=1 to n do
if score[i]>=upscore then
writeln(id[i],' ',score[i]);
end.

• @ 2013-11-28 15:03:58

测试数据 #0: Accepted, time = 0 ms, mem = 480 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 480 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 476 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 484 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 476 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 476 KiB, score = 10
测试数据 #6: Accepted, time = 0 ms, mem = 484 KiB, score = 10
测试数据 #7: Accepted, time = 0 ms, mem = 484 KiB, score = 10
测试数据 #8: Accepted, time = 15 ms, mem = 480 KiB, score = 10
测试数据 #9: Accepted, time = 0 ms, mem = 476 KiB, score = 10
Accepted, time = 15 ms, mem = 484 KiB, score = 100

#include<cstdio>
#include<cmath>
#include<stdlib.h>
struct aa{
int hao,fen;
}ren[5000];
int cmp(const void *a ,const void b)
{
if((
(aa*)a).fen>((aa)b).fen) return -1;
if(((aa)a).fen<((aa)b).fen) return 1;
if(((aa)a).hao<((aa)b).hao) return -1;
}
int main()
{
int i,n,m,num,line;
scanf("%d%d",&n,&m);
num=1.5*m;
for(i=0;i<n;i++) scanf("%d%d",&ren[i].hao,&ren[i].fen);
qsort(ren,n,sizeof(ren[0]),cmp);
line=ren[num-1].fen;
for(i=num;i<n;i++)
{
if(ren[i].fen>=line)
num++;
else
break;
}
printf("%d %d\n",line,num);
for(i=0;i<num;i++)
printf("%d %d\n",ren[i].hao,ren[i].fen);
return 0;
}

用快排很快就出来了，快排的比较函数得重新写一下，很水的题

• @ 2013-11-09 11:57:36

根据分数和序号求出每个数据的优先度再排序即可。AC代码如下
type
sbsb=record
hao:integer;
fen:byte;
root:longint;
end;
var
a:array[1..5000]of sbsb;
c:sbsb;
d,i,j,n,m:integer;

begin
readln(n,m);
for i:=1 to n do readln(a[i].hao,a[i].fen);
for i:=1 to n do a[i].root:=a[i].fen*10000+(10000-a[i].hao);
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i].root<a[j].root then begin
c:=a[i];a[i]:=a[j];a[j]:=c;
end;
d:=trunc(m*1.5);
while a[d+1].fen=a[d].fen do inc(d);
writeln(a[d].fen,' ',d);
for i:=1 to d do writeln(a[i].hao,' ',a[i].fen);
end.

• @ 2013-11-04 20:57:03

额...交错程序了

• @ 2013-11-04 21:42:30

这个题，先排序，排序时连带编号一块改变（PS 从大到小时编号小的在前，从小到大时编号大的在前），
然后就很简单了，另外注意样例中的情况，有分数相等的情况！！！

下面贴一下本人垃圾到爆的程序。。。
编译成功

测试数据 #0: Accepted, time = 0 ms, mem = 864 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 864 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 864 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 860 KiB, score = 10
测试数据 #4: Accepted, time = 3 ms, mem = 864 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 864 KiB, score = 10
测试数据 #6: Accepted, time = 15 ms, mem = 864 KiB, score = 10
测试数据 #7: Accepted, time = 15 ms, mem = 860 KiB, score = 10
测试数据 #8: Accepted, time = 46 ms, mem = 860 KiB, score = 10
测试数据 #9: Accepted, time = 0 ms, mem = 864 KiB, score = 10

var n,m,i,sum,nn,mm,j:longint;
a,b:Array[0..5001] of longint;
procedure sort(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l; j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do inc(i);
while x<a[j] do dec(j);
if not(i>j) then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
y:=b[i]; b[i]:=b[j]; b[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin
readln(n,m);
for i:=1 to n do readln(b[i],a[i]);
sort(1,n);
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]=a[j] then
if b[i]<b[j] then
begin
mm:=b[i]; b[i]:=b[j]; b[j]:=mm;
end;
nn:=trunc(m*1.5);
sum:=a[n-nn+1];
begin while a[n-nn+1]=sum do inc(nn); dec(nn); end;

writeln(sum,' ',nn);
for i:=n downto n-nn+1 do writeln(b[i],' ',a[i]);
end.

• @ 2013-10-28 01:26:38

不用快排。。。累死我也。。。

#include<stdio.h>
#include<windows.h>
int main()
{
int n,m,k,s,tot,total,nowp,tempk,temps,totally,left,right;
long i,temp;
short r[1010000]={0};
long rr[5001];

scanf("%d%d",&n,&m);

for (i=1;i<=n;i++)
{ scanf("%d%d",&k,&s);r[k+s*10000]=1;}

tot=0;
nowp=0;
total=0;
totally=0;
for (i=1009999;i>=11000;i--)
if (r[i]==1)
{ tempk=i%10000;temps=i/10000;
if (nowp==0)
{
if (tot+1<m*3/2)
{tot++;
total++;
rr[total]=i;
}
else
{
nowp=temps;
tot++;
total++;
rr[total]=i;
}
}else
if (nowp==temps)
{
total++;
rr[total]=i;
}
else break;
}

left=1;right=1;
while (right+1<=total)
if (rr[left]/10000==rr[right+1]/10000)
right++; else
{
for (i=1;i<=(right-left+1)/2;i++)
{temp=rr[left+i-1];
rr[left+i-1]=rr[right-i+1];
rr[right-i+1]=temp;
}

left=right=right+1;
}

for (i=1;i<=(right-left+1)/2;i++)
{temp=rr[left+i-1];
rr[left+i-1]=rr[right-i+1];
rr[right-i+1]=temp;
}

left=right=right+1;

printf("%d %d\n",rr[total]/10000,total);
for (i=1;i<=total;i++) printf("%d %d\n",rr[i]%10000,rr[i]/10000);
system("pause");
return 0;
}

• @ 2013-09-06 18:54:26

var n,m,m2,i,j,t1,ans,t2:longint;
m1:real;
fs:array[1..5000,1..2] of longint;
begin
ans:=0;
readln(n,m);
for i:=1 to n do readln(fs[i,1],fs[i,2]);
for i:=1 to n do
for j:=i+1 to n do
begin
if fs[i,2]<fs[j,2] then begin t1:=fs[i,1]; t2:=fs[i,2]; fs[i,1]:=fs[j,1]; fs[i,2]:=fs[j,2]; fs[j,1]:=t1; fs[j,2]:=t2; end;
if (fs[i,2]=fs[j,2]) and (fs[i,1]>fs[j,1]) then begin t1:=fs[i,1]; t2:=fs[i,2]; fs[i,1]:=fs[j,1]; fs[i,2]:=fs[j,2]; fs[j,1]:=t1; fs[j,2]:=t2; end;
end;
m:=trunc(m*1.5);
for i:=1 to n do if fs[i,2]>=fs[m,2] then inc(ans);
writeln(fs[m,2],' ',ans);
for i:=1 to ans do writeln(fs[i,1],' ',fs[i,2]);
end.

• @ 2013-08-28 12:07:53

var
a,b,c:array[1..5000]of integer;
i,j,k,m,n,l:integer;

procedure qsort(l,r: integer);
var i,j,x: longint; y:integer;
begin
i:=l;j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do inc(i);
while x<a[j] do dec(j);
if i<=j then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
y:=b[i]; b[i]:=b[j]; b[j]:=y;
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;

procedure qsort2(l,r: integer);
var i,j,x: longint; y:integer;
begin
i:=l;j:=r;
x:=b[(l+r) div 2];
repeat
while b[i]<x do inc(i);
while x<b[j] do dec(j);
if i<=j then
begin
y:=b[i]; b[i]:=b[j]; b[j]:=y;
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort2(l,j);
if i<r then qsort2(i,r);
end;

begin
readln(n,m);
m:=trunc(m*1.5);
l:=m;
//writeln(m);
for i:=1 to n do readln(b[i],a[i]);
qsort(1,n);
for i:=1 to n do c[n-i+1]:=a[i];
for i:=1 to n do a[i]:=c[i];
for i:=1 to n do c[n-i+1]:=b[i];
for i:=1 to n do b[i]:=c[i];
write(a[m],' ');
for i:=m+1 to n do
if (a[i]=a[m]) then inc(l);
writeln(l);
//for i:=1 to n do writeln(a[i],' ',b[i]);
for i:=1 to l do
begin
j:=i;
while a[i]=a[j+1] do inc(j);
qsort2(i,j);
end;
for i:=1 to l do
writeln(b[i],' ',a[i]);
end.

• @ 2013-08-28 12:07:47

我竟然是第一个发表题解的

• @ 2021-07-09 14:49:40
``````#include<bits/stdc++.h>
using namespace std;
int N,M,n,m;
struct Node{
int k,s;
}P[10001];
bool Compare(Node a,Node b){
if(a.s==b.s)return a.k<b.k;
return a.s>b.s;
}
int main(){
scanf("%d %d",&N,&M);
for(int i=1;i<=N;i++){
scanf("%d %d",&P[i].k,&P[i].s);
}
sort(P+1,P+N+1,Compare);
m=floor(M*1.5);
for(int i=1;;i++){
if(P[i].s>=P[m].s)++n;
else break;
}
printf("%d %d\n",P[m].s,n);
for(int i=1;;i++){
if(P[i].s>=P[m].s)printf("%d %d\n",P[i].k,P[i].s);
else break;
}
return 0;
}
``````
• @ 2017-10-20 21:21:00

不想说些什么了......
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct p{
int k,s;
}a[5005];
bool cmp(p a,p b){
if(a.s==b.s) return a.k<b.k;
else return a.s>b.s;
}
int main()
{
int n,m,x,num=0;
cin>>n>>m;
x=floor(m*1.5);
for(int i=1;i<=n;i++)
cin>>a[i].k>>a[i].s;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(a[i].s==a[x].s||a[i].s>a[x].s) num++;
}
cout<<a[num].s<<" "<<num<<endl;
for(int i=1;i<=num;i++)
cout<<a[i].k<<" "<<a[i].s<<endl;
return 0;
}

• @ 2017-10-20 21:48:26

渣渣渣渣渣渣

• @ 2017-10-20 21:48:55

啦啦啦德玛西亚
大哥你家有没有三百斤鸭
开车送到巴拿马
c哩c哩

• @ 2017-10-20 21:49:10

@yangyunhao: 渣渣渣

• @ 2017-10-20 21:50:42

@琀予: 扎咋还喳喳咋呼咋呼咋呼咋呼咋还轰炸和咋还会炸毁

• @ 2017-08-22 02:52:11

so water

``````#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n,i,j,a[5500],m,c[5500],h,a2,x,y,z;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d %d",&c[i],&a[i]);
}

for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(a[j]<a[j+1])
{
a2=a[j];
a[j]=a[j+1];
a[j+1]=a2;
a2=c[j];
c[j]=c[j+1];
c[j+1]=a2;
}
else if(a[j]==a[j+1])
{
if(c[j]>c[j+1])
{
a2=c[j];
c[j]=c[j+1];
c[j+1]=a2;
}
}
}
}
h=m*1.5;
for(i=h;a[i]==a[i+1];i++)
{
h++;
}
printf("%d %d\n",a[h],h);
for(i=1;i<=h;i++)
{
printf("%d %d\n",c[i],a[i]);
}
return 0;
}
``````

ID
1813

4

(无)

1557

691

44%

17