1293:Arch0nの興味深いゲーム
時間制限:1秒メモリ制限:32 MB 送信
:553解像度:168
[ 送信 ] [ ステータス ] [ ディスカッション ]
タイトルの説明
Arch0nの先生は金持ちで、若い頃才能とIQで大金を稼いでいました。IQをトレーニングするために、RGBゲームなどのIQをトレーニングする興味深いゲームを何度もプレイし、妹と一緒にDo n't Starveをプレイします。結局のところ、彼は今日新しい面白いゲームを発明しました。
Ar先生は手札にカードの山があり、カードにAi(正の整数)の数字を書き込みます。現在彼はn枚のカードを持っているので、常に2枚をランダムに取り、これらの2枚のカードを一目で確認できます。どちらが小さいか(同じですが、この操作はAr先生には単純すぎるようです)、これらの2枚のカードの有効スコアとして、彼は熟考に陥り、n枚のカードに2枚のカードを取りました。明らかに、特定の組み合わせの可能性があり、n *(n-1)/ 2組の組み合わせがあり、彼はこれらすべての組み合わせの中でk番目に大きいスコアを知りたいと考えています。
入力
データグループの数を表すtを入力します;(0 <t <= 10)
次の行はn、kです。これは、n枚のカードと最後のk番目に大きいスコアを意味します;(1 <n <2500、保証0 <k <= n *(n-1)/ 2)
次の行は、i番目のカードの番号を表すn個の値aiです(0 <ai <= 10000000)。
アウトプット
データの各グループは、1行、つまり、k番目に大きいスコアの値を出力します。
入力例
2 3 2 1 2 3 3 1 4 2 1
出力例
1 2
プロンプト
出典
Xidian 2018スクールトーナメントライブトーナメント
参照回答:
主な調査
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define sol(a) a*(a-1)/2
int aa[2505];
int main(){
int T;
scanf("%d",&T);
while(T--){
int m,n;
scanf("%d %d",&m,&n);
memset(aa,0,sizeof(aa));
for(int i=0;i<m;i++){
scanf("%d",&aa[i]);
}
sort(aa,aa+m);
int low=1,high=m,mid;
while(low<=high){
mid=low+(high-low)/2;
if(mid==low){
break;
}
if(sol(mid)>=n)
{
high=mid;
}else if(sol(low)<n)
{
low=mid;
}
}
printf("%d\n",aa[m-mid-1]);
}
return 0;
}