XDOJ 1293:Arch0nの興味深いゲーム

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;
}

 

元の記事を108件公開 48 件を賞賛 5万回以上の閲覧

おすすめ

転載: blog.csdn.net/larry1648637120/article/details/89410909