题目直通车:http://codeforces.com/problemset/problem/160/C
知识要点:
题目大意:
大概就是给你几个数去形成pair,然后查找按照升序排列的第几个pair.
例如 输入 2,4 表示两个数字,查找第四个pari。两个数字 为 2,1 那么形成 <1,1> <1,2> <2,1> <2,2>四个pair 输出第四个为 《2,2》.
解题思路:
首先先将数字排序,之后确定第一个数字为 a[(k-1)/n+1]。(因为每一个数字都能与其他以及包括自己的数字组成对,所以第一个数字为a[(k-1)/n+1];
之后来确定第二个数字
假如我同样运用方法一来确定那么可能存在问题 例如 当样例为 {1,1,3}时,顺序为<1,1> <1,1> <1,3> <1,1> <1,1><1,3> <3,1> <3.1> <3.3>
而正确的 顺序为<1,1> <1,1> <1,1><1,1> <1,3><1,3><3,1><3,1>
所以说我们采取的方法
1.计算和第一个数字相同的数字 firstnum
2.减去第一个数字之前的数字个数乘以 n (即表示第一个以firstnum 开头的对)
3.计算lastnum 相当于将整个数组放大 重复次数倍
a.当lastnumloc 小于重复次数时候 lastnum = a[0]
b.当lastnumloc 大于重复次数时候 通过取余计算 lastnum
例如 {1,1,3}时
首先计算 fistnum 得 1, 计算出1重复的次数为 2
类似的将数组看作放大 2倍 (其实没有) {1,1,1,1,3,3}
找寻到lastnum.
代码:
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
int main()
{
long long n,k,firstnum,lastnum;
long long a[100005];
long long cnt,firstnumloc,lastnumloc;
int i;
scanf("%lld%lld",&n,&k);
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
firstnum=a[(k-1)/n+1];
cnt=0;
for(i=1;i<=n;i++)
{
if(a[i]==firstnum)
cnt++;
}
for(i=1;i<=n;i++)
{
if(a[i]==firstnum)
{
firstnumloc=i;
break;
}
}
lastnumloc=k-(firstnumloc-1)*n;
if(lastnumloc<=cnt)
lastnum=a[1];
else
lastnum=a[(lastnumloc-1)/cnt+1];
printf("%lld %lld\n",firstnum,lastnum);
return 0;
}