列表

详情


NC206122. 排序

描述

    有个学生,每个学生有一个能力值。

    A,B两个老师按照能力值从大到小排序将个学生排序,能力值相同的顺序随意。

    求出A,B两种排序方式对应位置相同个数的期望。

输入描述

第一行一个数

接下来一行个数,每个人的能力值。

输出描述

一个数,A,B两种排序方式对应位置相同个数的期望。

示例1

输入:

3
1 2 3

输出:

3

说明:

A,B都只有一种排序方式,只能从大到小。

示例2

输入:

3
2 1 1

输出:

2

说明:

给三个学生编号[1,2,3],能力值分别为[2,1,1]。

共有4种情况:

A[1,2,3] B[1,2,3] 3个位置对应相同。

A[1,2,3] B[1,3,2] 1个位置对应相同。

A[1,3,2] B[1,2,3] 1个位置对应相同。

A[1,3,2] B[1,2,3] 3个位置对应相同。

计算期望

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java 解法, 执行用时: 735ms, 内存消耗: 39848K, 提交时间: 2021-10-10 23:57:27

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), sum = 0;
        int[] arr = new int[1000005];
        for (int i = 0; i < n; i++) {
            int t = in.nextInt();
            if (arr[t] == 0) {
                arr[t] = 1;
                sum++;
            }
        }
        System.out.println(sum);
    }
}

C++14(g++5.4) 解法, 执行用时: 34ms, 内存消耗: 4836K, 提交时间: 2020-05-10 14:15:36

#include<bits/stdc++.h>
using namespace std;
int m,n,i,j,ans;
int a[100010],vis[1000010];
int main()
{
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(!vis[a[i]])
		{
			vis[a[i]]=1;
			ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 28ms, 内存消耗: 4448K, 提交时间: 2020-05-10 14:16:44

#include<bits/stdc++.h>
using namespace std;
unsigned int a[1000005];
int main()
{
	int n,sum=0;
	scanf("%d",&n);
	while(n--)
	{
		int i;
		scanf("%d",&i);
		if(a[i]==0)
		{
			a[i]=1;
			sum++;
		}
	}
	printf("%d\n",sum);
}

上一题