组委会正在为美团点评CodeM大赛的决赛设计新赛制。
比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛、复赛的成绩,会有不同的积分。比赛采取锦标赛赛制,分轮次进行,设某一轮有 m 个人参加,那么参赛者会被分为 m/2 组,每组恰好 2 人,m/2 组的人分别厮杀。我们假定积分高的人肯定获胜,若积分一样,则随机产生获胜者。获胜者获得参加下一轮的资格,输的人被淘汰。重复这个过程,直至决出冠军。
现在请问,参赛者小美最多可以活到第几轮(初始为第0轮)?
第一行一个整数 n (1≤n≤ 2^20),表示参加比赛的总人数。
接下来 n 个数字(数字范围:-1000000…1000000),表示每个参赛者的积分。
小美是第一个参赛者。
小美最多参赛的轮次。
4 4 1 2 3
2
#通过率百分之95,超过使用内存,可能是排序的问题 #!/usr/bin/env python # coding=utf-8 if __name__ == "__main__": m=int(raw_input()) a=map(int,raw_input().split()) n=a[0] a.sort() roun=0 for k in range(1,21): if 2**k==m: h=k if len(a)==1: roun=0 elif n<a[1]: roun= 0 elif n>=a[-1]: roun= h else: for i in range(h) : x=(a[:2**i])[-1] y=(a[:2**(i+1)])[-1] if x<=n<y: roun= i print roun
#比赛只在分数小于等于小美的这群人里进行,比小美分数高的不管
#所以统计算上小美在内的分数小于等于小美的人数
#每次除以2,取整数部分(多出来的那一个和分数高的人去比了)
#最后,能除几次2,就能比几次。
#注意的情况是,如果小美不是全场最大,最后一次厮杀小美输掉
#这局不算“活下来”,所以最后一次不算。 #include <iostream>
#include <vector>
using namespace std;
int main() {
long long n;
while (cin >> n) {
long long d1,d2;
if (n == 1)
{
cin >> d1;
cout << 0 << endl;
continue;
}
if (n == 2)
{
cin >> d1;
cin >> d2;
if (d1 < d2)
cout << 0 << endl;
else
cout << 1 << endl;
continue;
}
long long tmp, count = 1, myScore, answer = 0;
cin >> myScore;
for (size_t i = 0; i < n - 1; i++)
{
cin >> tmp;
if (tmp <= myScore) count++;
}
while (count != 1)
{
count /= 2;
answer++;
}
cout << answer << endl;
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] scores = br.readLine().split(" ");
int mei = Integer.parseInt(scores[0]);
int rank = 1;
// 找到有多少人可以排小美前面
for(int i = 1; i < n; i++){
if(Integer.parseInt(scores[i]) <= mei){
rank++;
}
}
System.out.println(log2(rank));
}
private static int log2(int n) {
return (int)(Math.log(n) / Math.log(2));
}
} 注意求小美分数的排名千万不要去排序,这个数据量下排序会超时,直接O(N)的复杂度看有多少人可以排在她的前面就行。 import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int my = scanner.nextInt();
int small = 1;
for (int i = 1; i < n; i++) {
if (scanner.nextInt()<=my) {
small++;
}
}
System.out.println((int)Math.floor(Math.log(small)/Math.log(2)));
scanner.close();
}
}
//只通过了95%的数据
//不懂为什么会有样例是1048576,输出17,奇怪
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int [] score = new int [n];
for(int i = 0;i < n;i++){
score[i] = scanner.nextInt();
}
int max = score[0];
int count = 0;
int number = 0;
int xiaomei = score[0];
for(int i = 1;i < n;i++){
if(score[i] <= xiaomei){
number++;
}
if(score[i] > max){
max = score[i];
}
}
if(number == 0){
System.out.println(0);
return;
}
else {
while(true){
if(number/2 > 0){
count++;
number /= 2;
}
else {
break;
}
}
/*if(xiaomei == max){
System.out.println(count);
}
else {
System.out.println(count-1);
}*/
System.out.println(count);
}
}
}
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
int n;
while(cin>>n){
vector<int> score(n,0);
for(int i=0;i<n;i++)
cin>>score[i];
int m=score[0],index=1,turns;
for(int i=0;i<n;i++){
for(int j=n-1;j>i;j--){
if(score[j]<score[j-1]){
int temp=score[j-1];
score[j-1]=score[j];
score[j]=temp;
}
}
}
for(int i=0;i<n;i++)
if(m==score[i])
index=i+1;
turns=(int)(log(index*1.0)/log(2.0));
cout<<turns<<endl;
}
//system("pause");
return 0;
} 2为底k(小美的能力在所有人当中第k小)的对数,再向下取整 运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为70.00%
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int n = scan.nextInt();
int p = scan.nextInt();
int count = 0;
int t = 0;
for(int i = 0; i < n - 1; i++){
t = scan.nextInt();
if(t <= p)
count++;
}
System.out.println(getMax(count,n));
}
}
private static int getMax(int count, int n) {
// TODO Auto-generated method stub
if(count == 0)
return 0;
if(index == n - 1)
return (int) (Math.log(n)/Math.log(2));
if(index >= (n/2 - 1))
return (int) (Math.log(n/2)/Math.log(2));
else
return (int) (Math.log(count + 1)/Math.log(2));
}
}
通过率只有85%,提醒超出内存限制,不懂。求解
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int a[] = new int[n];
a[0] = scan.nextInt();
int xm = a[0];
int left = -1, right = 0;
for (int i = 1; i < n; i++) {
a[i] = scan.nextInt();
if (a[i] <= xm)
left++;
else
right++;
}
int count = 0;
while (left != -1) {
if (left % 2 == 1) {
right = (right + 1) / 2;
left = (left - 1) / 2 - 1;
} else {
right = right / 2;
left = left / 2 - 1;
}
count++;
}
System.out.println(count);
scan.close();
}
}