小米OJ编程题-不一样的排序

前言

起初使用了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;
	
}
发布了99 篇原创文章 · 获赞 44 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/NetRookieX/article/details/89715494
今日推荐