您的位置:首页 > 其它

CodeForcesDiv2第111专场C题

2012-03-07 16:14 288 查看
此题题意是给你n个数以及一个k,两两总共有n2 种组合,(p1,q1)<(p2,q2)当p1<p1或者p1=p2,q1<q2两种情况时,如果把所有组合都列出来求出第k个组合,那么肯定超时。所以另觅他径,把n的数排序,考虑相等的情况,比如1 1 1 2 2 5,i = 1,j = 4时,a[i]!=a[j] 此时判断k是否在(i-1)*n和(j-1)*n之间,如果不在,则i=j,否则p1=a[i],p2=a[(k-(i-1)*n)/(j-i)+1],此处3个1有9种组合。

注意(i-1)*n,(j-1)*n的值会超出int范围,有2中做法解决:1.把表达式中的n强制转换成(__int64)类型;2.在输入n值的时候直接申明n的类型为__int64。一个表达式如果左右两边的类型不匹配的时候,类型小的会强制转换成类型大的。

代码如下:

#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <fstream>
#include <utility>
#include <iomanip>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <ctype.h>
#include <limits.h>
using namespace std;
int cmp1(const void* a,const void* b){
return (*(int*)a)-(*(int*)b);
}

int main()
{
freopen("F://学习//算法//codeblock//11//in111.txt","r",stdin);
//freopen("F://学习//算法//codeblock//11//in.txt","w",stdout);
int n;
__int64 k;
int a[100005];
scanf("%d%I64d",&n,&k);
//memset(a,0,sizeof(a));
int i,j;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
qsort(a+1,n,sizeof(a[0]),cmp1);
j=1;
for(i=1;i<=n;){
while(j<=n&&a[i]==a[j]){
j++;
};
//i-1在运算前会转换成n的类型,如果n是int,那么乘积可能溢出,导致随机数,所以应该先把n强制转换成__int64类型
//或者在定义n的时候用__int64 类型接收
if(k>(__int64)(i-1)*n&&k<=(__int64)(j-1)*n){
printf("%d %d\n",a[i],a[(k-(__int64)(i-1)*n-1)/(j-i)+1]);
}
i=j;
}
return 0;
}


------->froest
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: