前言
起初使用了Python3,可是运行时间超时…我也不知道这个时间是怎么计算的。然后我认栽,怪我用了Python。然后我花了很久的时间把Python代码改成C++,心想这回能通过了吧!谁知运行时间还加了0.02s,什么鬼!!!说好的Python慢呢。认栽,这回小米OJ算是重在参与了…
心有不甘,代码结果是正确的。如果有小伙伴知道怎么改进,可以留言吗,万分感谢。
题目
有一天利姆鲁想教他的哥布林部下学数学,因为他之前教过因子,现在想考考他们。
利姆鲁问现在有 n 个数,需要用因子个数的多少进行排序,因子个数多的排在后面,因子个数少的排在前面,如果因子个数相同那么就比较这个数的大小,数大的放在后面,数小的放在前面。现在让你说出排序之后第 K 个位置的数字是多少。
输入
第 1 个整数为整数 K,1 ≤ K ≤ 10^6
第 2 个为整数 nn,表示数字的数量,n < 10^7
接下来有 n 个整数,每个数的大小不超过 10^6
输出
输出排序之后的第 K 位置的数值。
输入样例
4 6 1 2 3 4 5 6
输出样例
5
Python实现
import cmath
def count_of_yinshu(num):
if num == 1:
return 1
count=2
sqrt=int(abs(cmath.sqrt(num)))
if sqrt*sqrt==num:
count=count+2
flag=0
if sqrt==abs(cmath.sqrt(num)):
flag=0
else:
flag=1
for i in range(2,sqrt+flag):
for j in range(sqrt,num):
if i*j==num:
count = count + 2
return count
def compare_yinshu(num1,num2):
if count_of_yinshu(num1) < count_of_yinshu(num2):
return "<"
elif count_of_yinshu(num1) > count_of_yinshu(num2):
return ">"
else:
if num1 < num2:
return "<"
else:
return ">"
import sys
for line in sys.stdin:
input = line.strip().split()
for i in range(len(input)):
input[i]=int(input[i])
k=input[0]
del input[0]
del input[0]
for i in range(len(input) - 1):
min = i
for j in range(i + 1, len(input)):
if compare_yinshu(input[min], input[j]) == ">":
min = j
temp = input[min]
input[min] = input[i]
input[i] = temp
print(input[k-1])
C++实现
#include<iostream>
//#include <bits/stdc++.h>
#include<cmath>
using namespace std;
int count_of_yinshu(int num){
if (num == 1)
return 1;
int count = 2;
int mysqrt = sqrt(double(num));
if (mysqrt*mysqrt == num)
count = count + 2;
int flag = 0;
if (mysqrt == sqrt(double(num)))
flag = 0;
else
flag = 1;
for (int i = 2; i < mysqrt + flag; i++){
for (int j = mysqrt; j < num; j++){
if (i*j == num)
count = count + 2;
}
}
return count;
}
char compare_yinshu(int num1,int num2){
if (count_of_yinshu(num1) < count_of_yinshu(num2))
return '<';
else if (count_of_yinshu(num1) > count_of_yinshu(num2))
return '>';
else
if (num1 < num2)
return '<';
else
return '>';
}
int main()
{
int k, n;
cin >> k;
cin >> n;
int *input = new int[n];
for (int i = 0; i < n; i++)
cin >> input[i];
int min=0,temp= 0;
for (int i = 0; i < n - 1; i++){
min = i;
for (int j = i + 1; j < n; j++){
if (compare_yinshu(input[min], input[j]) == '>')
min = j;
}
temp = input[min];
input[min] = input[i];
input[i] = temp;
}
cout << input[k - 1];
getchar(); getchar(); getchar();
return 0;
}