首页 > 试题广场 >

晋级人数

[编程题]晋级人数
  • 热度指数:8755 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

小团是某综艺节目的策划,他为某个游戏环节设计了一种晋级规则,已知在这个游戏环节中每个人最后都会得到一个分数score_i,显而易见的是,游戏很有可能出现同分的情况,小团计划该环节晋级人数为x人,则将所有人的分数从高到低排序,所有分数大于等于第x个人的分数且得分不为0的人都可以晋级。

请你求出本环节的实际晋级人数。显然这个数字可能是0,如果所有人的得分都是0,则没有人满足晋级条件。


输入描述:

输入第一行包含两个正整数n和x,分别表示参加本环节的人数,和小团指定的x。

输入第二行包含n个整数,每个整数表示一位选手的得分。



输出描述:
输出仅包含一个整数,表示实际晋级人数。
示例1

输入

5 4 
0 0 2 3 4

输出

3
思路很简单模拟一遍题目就好了,我们首先讲数组按照从大到小排序,随后直接定位到第x个元素所在的位置,如果x所在的位置为0那么我们要做的就是向前遍历将分数为0的排除掉,如果x所在的位置不为0那么我们就要考虑后面的元素和x所在元素是否相同,相同的话是要一并晋级的(这种情况下实际晋级人数比x多),需要注意的一个细节就是因为我们要重写Arrays.sort()的缘故所以我们要使用包装类Integer数组需要注意[-128, 127]的缓冲区问题要使用equals方法
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = 0, x = 0;
        Integer[] nums;
        while (scanner.hasNextInt()) {
            n = scanner.nextInt();
            x = scanner.nextInt();
            nums = new Integer[n];
            for (int i = 0; i < nums.length; i++)
                nums[i] = scanner.nextInt();
            //从大到校排列
            Arrays.sort(nums, (a, b) -> b - a);
            int i = x - 1;
            if (nums[i].equals(0)) {
                //削0
                while (nums[i].equals(0))
                    i--;
            } else {
                //尝试查看右边数字是否和自身相同
                while (i < nums.length && nums[i + 1].equals(nums[x - 1]))
                    i++;
            }
            System.out.println(i + 1);
        }
    }
}


发表于 2022-03-07 21:37:02 回复(0)
n, x = map(int, input().split())
score = [int(x) for x in input().split()]
# print(score)
score = sorted(score, reverse=True)
# print(score)
x_score = score[x-1]
num = 0

for i in range(len(score)):
	if score[i] >= x_score and score[i] != 0:
		num += 1

print(num)

发表于 2021-04-24 22:28:05 回复(0)
这个“小团计划晋级x人”很误导我,刚开始还以为晋级人数只会<=x。但实际上如果分数排名第x的人的分数不为0且存在并列的情况,会将并列的人全部晋级,从而使得晋级人数超过x。我们先对分数进行排序(可以升序也可以降序),然后分以下几种情况进行讨论:
(1) 如果最大值为0,那肯定所有得分均为0,没有人晋级。
(2) 如果最大值不为0,先计算以下分数第x大的人得了多少分,作为baseline:
      i) 如果baseline为0,就要找到第一个分数不为0的人,分数大于等于他的都能晋级。
      ii) 如果baseline为0,就检查还有多少个并列,把这些人也一同晋级。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().trim().split(" ");
        int n = Integer.parseInt(params[0]);
        int x = Integer.parseInt(params[1]);
        params = br.readLine().trim().split(" ");
        int[] scores = new int[n];
        for(int i = 0; i < n; i++)
            scores[i] = Integer.parseInt(params[i]);
        Arrays.sort(scores);
        int count = x;
        int baseline = scores[n - x];
        if(scores[n - 1] == 0){
            count = 0;
        }else{
            if(baseline > 0){
                count --;
                while(scores[n - x] == baseline){
                    count ++;
                    x ++;
                }
            }else{
                while(scores[n - x] == baseline){
                    count --;
                    x --;
                }
            }
        }
        System.out.println(count);
    }
}


发表于 2021-03-07 09:06:50 回复(0)
  • 语言:Java

题解

计划该环节晋级人数为x人,则将所有人的分数从高到低排序,所有分数大于等于第x个人的分数且得分不为0的人都可以晋级,可能存在重复的分数情况;

例如

n=8 x=5
arr:0 1 1 1 2 3 4 5

排名第五的分数为arr[3]= 1;但是arr[0]arr[1] 分数也为1;故也算晋级的人;

  1. 将得分数组arr从小到大排序;
  2. 排名第五的人分数为base=arr[n-x];
  3. 遍历数组arr:
    • 如果遍历到的分数为0,跳过;
    • 直到遍历到分数=base,则能晋级的人数为n-i

代码

import java.io.*;
import java.util.Arrays;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s = br.readLine().trim().split(" ");
        int n = Integer.parseInt(s[0]);
        int x = Integer.parseInt(s[1]);

        int[] arr = new int[n];
        s = br.readLine().trim().split(" ");
        for(int i = 0; i < n; i++){
            arr[i] = Integer.parseInt(s[i]);
        }
        int res = 0;
        int len = arr.length;
        Arrays.sort(arr);
        int base = arr[n - x];
        for(int i = 0; i < n; i++){
            if(arr[i] == 0) continue;
            else if(arr[i] == base) {
                res =n - i;
                break;
            }
        }
        System.out.println(res);
    }
}

复杂度

  • 时间复杂度:O(N)
发表于 2021-04-03 16:43:17 回复(2)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
    int n, x;
    cin>>n>>x;
    int res = x;
    vector<int> nums(n, -1);
    for(int i = 0; i < n; i++) cin>>nums[i];
    sort(nums.rbegin(), nums.rend());
    int index = x - 1;
    if(nums[0] == 0) res = 0;
    else{
        if(nums[index] != 0) {
            for(int i = index + 1; i < n; i++) {
                if(nums[i] == nums[i - 1]) res++;
                else break;
            }
        }else {
            while(index >= 0 && nums[index] == 0){
                index--;
                res--;
            } 
        }
    } 
    cout<<res;
    return 0;
}

发表于 2022-06-10 23:07:02 回复(0)
# 提取第x人的分数 score[x-1]
# 大于等于第x人的分数为晋级人数 score[i]
a = list(map(int,input().strip().split()))
n,x = a
score = list(map(int,input().strip().split()))
score.sort()

num = 0
for i in range(n):
    if score[i]>=score[n-x-1] and score[i]!=0:
        num += 1
print(num)
编辑于 2023-08-01 10:13:35 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int x = in.nextInt();
            double[] s1 = new double[n];
            double[] s2 = new double[n];
            ArrayList<Double> list = new ArrayList<Double>();
            for (int i = 0; i < s1.length; i++) {
                s1[i] = in.nextInt();
                list.add(s1[i]);
            }
            Arrays.sort(s1);
            for (int i = 0; i < s1.length; i++) list.add(s1[i]);
            Collections.reverse(list);
            for(int i=0;i<s1.length;i++) s2[i]=list.get(i);
            if(s2[0]<=0||n<x) System.out.println(0);
            else{
                int count=0;
                for(int i=0;i<n;i++){
                    if(s2[i]>=s2[x-1]&&s2[i]!=0) count++;
                }
                System.out.println(count);
            }
        }
    }
}
发表于 2023-03-24 15:56:55 回复(0)
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int x = sc.nextInt();
        Integer[] arr = new Integer[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        Arrays.sort(arr, Collections.reverseOrder());
        int res = 0;
        for (int j = 0; j < n; j++) {
            if (arr[j] >= arr[x] && arr[j] != 0) {
                res++;
            }
        }
        System.out.println(res);
    }
}
发表于 2022-10-07 21:11:27 回复(0)
n, x = map(int, input().split())
score = [int(x) for x in input().split()]
score = sorted(score)
score.reverse()
tem = 0
aim = score[x-1]
new = []
for i in score:
  if i >= aim and i != 0:
    new.append(i)

print(len(new))


读题真费劲,开始还写错了
发表于 2022-09-01 10:04:00 回复(0)
# 获取总人数及晋级人数
n_x =list(map(int, input().split(" ")))
n =n_x[0]
x =n_x[1]
# 获取分数并排序
scores =list(map(int, input().split(" ")))
scores.sort()
fori inrange(n):
    ifscores[i] !=0andscores[i] >=scores[n-x]:
        break
print(n-i)
发表于 2022-08-31 21:59:02 回复(0)
import java.util.Arrays;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt(),n = sc.nextInt();
        int[] num = new int[m];
        for (int i = 0; i < m; i++) {
            num[i] = sc.nextInt();
        }
        Arrays.sort(num);
        int base = num[m-n];
        int count = 0;
        for (int i = 0; i < m; i++) {
            if(num[i]>=base&&num[i]!=0){
                count++;
            }
        }
        System.out.println(count);





    }
}

发表于 2022-08-31 15:45:42 回复(0)
n, x = map(int, input().strip().split())
a = list(map(int, input().strip().split()))
a.sort(reverse=True)
s = a[x-1]
p=0
for i in range(n):
    if a[i]==0:
        continue
    elif a[i]>=s:
        p+=1
print(p)
发表于 2022-08-27 14:47:38 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        String s2 = in.nextLine();
        int n = Integer.parseInt(s1.split(" ")[0]);
        int x = Integer.parseInt(s1.split(" ")[1]);
        int[] scores = new int[n];
        String[] str = s2.split(" ");
        for (int i = 0; i < n; i++) {
            scores[i] = Integer.parseInt(str[i]);
        }
        Arrays.sort(scores);
        int res = x;
        int line = scores[n - x];
        for (int i = n - x - 1; i >= 0; i--) {
            if (scores[i] >= line) {
                res++;
            }else {
                break;
            }
        }
        System.out.println(res);
    }
}

发表于 2022-08-09 11:19:35 回复(0)
纪念第一次不到半小时通过的编程题,我好开心!
package main

import (
	"fmt"
	"sort"
)

func Win(peo []int, x int) int {
	sort.Ints(peo)
	var res int
	for i:=len(peo)-1;i>=len(peo)-x;i--{
		if peo[i]==0{
			return res
		}
		if i==len(peo)-x&&peo[i]==peo[i-1]{
			res++
            x++
            continue
		}
		res++
	}
	return res
}

func main() {
	var n,x int
	fmt.Scan(&n,&x)
	peo:=make([]int,n)
	for i:=0;i<n;i++{
		fmt.Scan(&peo[i])
	}
	res:=Win(peo,x)
	fmt.Println(res)
}


发表于 2022-05-21 15:04:11 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;


public class Test02 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(" ");
        int n = Integer.parseInt(str[0]);
        int x = Integer.parseInt(str[1]);
        int[]ans = new int[n];
        String[] str1 = br.readLine().split(" ");
        for(int i=0;i<n;i++){
            ans[i] = Integer.parseInt(str1[i]);
        }
        Arrays.sort(ans);
        int i=0;
        for(i=n-x-1;i<n;i++){
            if(ans[i]!=0)break;
        }
        if(i<n){
            for(;ans[i]!=0&&i-1>=0;i--) {
                if (ans[i] != ans[i - 1]) break;
            }
        }
        System.out.println(n-i);

    }
}

发表于 2022-04-01 20:38:50 回复(0)

简简单单排个序

import java.util.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] arr = br.readLine().split(" ");
        int n = Integer.valueOf(arr[0]), x = Integer.valueOf(arr[1]);
        Integer[] scores = Arrays.stream(br.readLine().split(" ")).map(Integer::valueOf).filter(v -> v > 0).toArray(Integer[]::new);
        Arrays.sort(scores, (o1, o2) -> o2 - o1);
        if (scores.length <= x) {
            bw.write(String.valueOf(scores.length));
        } else {
            int i = x;
            while (i < scores.length && scores[i].equals(scores[x - 1])) i++;
            bw.write(String.valueOf(i));
        }
        bw.flush();


    }
}
发表于 2022-03-29 23:34:02 回复(0)
js做法
var line1=readline().split(' ')
var n=parseInt(line1[0])
var x=parseInt(line1[1])
var line2=readline().split(' ')
var score=[]
for(let i=0;i<n;i++){
    score.push(parseInt(line2[i]))
}
score=score.sort((a,b)=>b-a)
if(score[0]==0){
    print(0)
}else{
    var num=0
    let sx=score[x-1]
    for(let i=0;i<n;i++){
        if(score[i]>=sx && score[i]>0){
            num++
        }
    }
    print(num)
}


发表于 2022-03-26 11:31:24 回复(0)

这道题其实就是求TopK问题的,只不过包装了一下,本质是获取到输入后,求解数组集合中第k大的数字是什么。那么我们有三种方法:

  • 直接调用API排序,时间复杂度O(NlogN)
  • 使用优先队列,维护一个最小堆,存放前k大元素,堆顶就是我们的第k大元素,时间复杂度O(NlogK)
  • 使用快排的partition操作,每次找到一个排序的位置,然后判断是不是我们要找的那个,如果不是就缩小范围。时间复杂度O(N)
发表于 2022-03-16 14:48:15 回复(0)
//这道题有点坑  使用Integer.valueof是装箱操作   如果使用==号进行判断那么有效范围为-128-127 如果超过这个范围就要用equals比较  所以最好都是用eqauls

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

//分数线
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] line1 = sc.nextLine().split(" ");
        String[] line2 = sc.nextLine().split(" ");
        Integer[] l2 = new Integer[line2.length];
        for(int i=0;i<line2.length;i++){
            l2[i] = Integer.valueOf(line2[i]);
        }
        Arrays.sort(l2, Collections.reverseOrder());
   

        int num = 0;
        for(int i=0;i<l2.length;i++){
            if((i<Integer.valueOf(line1[1]))||(l2[i].equals(l2[Integer.valueOf(line1[1])-1]))){
                
                if(l2[i]!=0){
                    num++;
                }
                
            }
      

        }
        System.out.println(num);
    }
}

发表于 2021-09-11 22:48:10 回复(1)
import java.util.Scanner;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int x = in.nextInt();
        Integer[] a = new Integer[n];
        for(int i = 0; i < n; i++) {
            a[i] = in.nextInt();
        }
        Arrays.sort(a, (o1, o2) -> o2-o1);
        int ans = 0;
        for(int i = 0; i < n; i++) {
            if(a[i] != 0 && a[i] >= a[x-1]) {
                ans++;
            }
        }
        System.out.println(ans);
    }
}

发表于 2021-09-03 15:44:20 回复(0)