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); }