小易的软件有一个神奇的功能,能够通过一个百分数来反应你的成绩在班上的位置。“成绩超过班级 ...% 的同学”。
设这个百分数为 p,考了 s 分,则可以通过以下式子计算得出 p:
p = ( 分数不超过 s 的人数 - 1)
突然一天的英语考试之后,软件突然罢工了,这可忙坏了小易。成绩输入这些对于字写得又快又好的小易当然没有问题,但是计算这些百分数……这庞大的数据量吓坏了他。
于是他来找到你,希望他编一个程序模拟这个软件:给出班级人数 n,以及每个人的成绩,请求出某几位同学的百分数。
第一行一个整数 n,表示班级人数。
第二行共 n 个自然数,第 i 个数表示第 i 位同学的成绩。
第三行一个整数 q,表示询问的次数。
接下来 q 行,每行一个数 x,表示询问第 x 位同学的百分数。
输出应有 q 行,每行一个百分数,对应每一次的询问。
为了方便,不需要输出百分号,只需要输出百分号前的数字即可。四舍五入保留六位小数即可。
3 100 98 87 3 1 2 3
66.666667 33.333333 0.000000
发现分数最大值是150, 题目要求每次找不超过分数x的人数,需要找10000次。
#include <bits/stdc++.h> using namespace std; const int N = 10010, M = 160; int a[N], mp[M]; int n, q; int main() { scanf("%d", &n); memset(mp, 0, sizeof mp); for (int i = 1; i <= n; ++ i) { scanf("%d", &a[i]); mp[a[i]] ++ ; } scanf("%d", &q); int x; while (q -- ) { scanf("%d", &x); int cnt = 0; for (int i = 0; i <= a[x]; ++ i) { cnt += mp[i] ; } // 必须用double,用float 错误 double ret = (cnt - 1) * 100.0 / n ; printf("%.6lf\n", ret); } return 0; }
#include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { vector<int>scores; int n; //班级人数 cin >> n; int* a = new int[n]; for (int i = 0; i < n; i++) { cin >> a[i]; //每个学生的分数 } int q; //询问的次数 cin >> q; for (int i = 0; i < q; i++) { int bianhao; cin >> bianhao; //询问的是哪个学生 scores.push_back(a[bianhao-1]); //q个学生的成绩放入vector中 } sort(a, a + n); for (int i = 0; i < q; i++) { for (int j = n - 1; j >= 0; j--) { if (a[j] == scores[i]) { double percent = j*100.0 / n; printf("%.6lf\n", percent); break; } } } }
思路:排序成绩数组,之后通过二分查找找到成绩在数组中的位置,即可知道有多少同学的分数低于他/她。
排序和二分查找的时间复杂度均为O(n log(n))。
import bisect n = int(input()) scores = list(map(int, input().split())) sort = sorted(scores) q = int(input()) for _ in range(q): idx = int(input()) - 1 rank = bisect.bisect(sort, scores[idx]) - 1 print('{:.6f}'.format(rank * 100 / n))
思路:类似于计数排序,因为成绩是有范围的0 - 150,创建一个合适范围的数组,统计每个分数下有多少学生。之后通过累积和计算出小于该分数的学生数。
统计的时间复杂度为O(n)。
空间复杂度为O(1)。无论多少学生,总是需要一个长度为(最大分数 + 1)的分数数组。
n = int(input()) scores = list(map(int, input().split())) q = int(input()) counter = [0] * 151 for s in scores: counter[s] += 1 # 统计分数小于等于 i 的人数,存储在 counter[i] 中 for i in range(1, len(counter)): counter[i] += counter[i - 1] for _ in range(q): x = int(input()) s = scores[x - 1] # 第 x 位同学的分数 print('{:.6f}'.format((counter[s] - 1) * 100 / n))
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = sc.nextInt(); } int query = sc.nextInt(); for (int i = 0; i < query; i++) { int index = sc.nextInt(); double ans = moreThan(nums,index) * 1.0 / n * 100; System.out.printf("%.6f",ans); System.out.println(); } } public static int moreThan(int[] nums, int i){ int point = nums[i - 1]; int count = 0; for (int j = 0; j < nums.length; j++) { if(nums[j] <= point) ++count; } return --count; } }
#include<iostream> using namespace std; int main() { double n;//班级人数 double a[10002]; int q;//询问的次数 double x; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } cin >> q; int m; double y = 0; for (int i = 0; i < q; i++) { cin >> m; for (int k = 1; k < n + 1; k++) { if (a[m] >= a[k]) y++; } x = (y - 1) / n * 100; printf("%0.6lf\n", x); y = 0; } return 0; }
import java.util.*; public class Main{ public static void main(String[] args) { Main main = new Main(); Scanner sc = new Scanner(System.in); while (sc.hasNext()){ int len = sc.nextInt(); int[] scores = new int[len]; for (int i=0;i<len;i++){ scores[i] = sc.nextInt(); } HashMap<Integer,Integer> scoreMap = main.creatHashmap(scores,len); int queryLen = sc.nextInt(); for (int i = 0;i<queryLen;i++){ System.out.printf("%.6f\n",main.outputRank(scoreMap,scores,len,sc.nextInt()-1)); } } } public HashMap<Integer,Integer> creatHashmap(int[] scores,int len){ int[] copy = Arrays.copyOf(scores,len); Arrays.sort(copy); HashMap<Integer,Integer> hashpmap = new HashMap<>(); int count = 0; for (int i=0;i<len;i++){ if (hashpmap.containsKey(copy[i])){ hashpmap.put(copy[i],hashpmap.get(copy[i])+1); count++; } else{ count++; hashpmap.put(copy[i],count); } } return hashpmap; } public Double outputRank(HashMap<Integer,Integer> hashMap,int[] scores,int len,int query){ double ans=0; double rank = hashMap.get(scores[query]); ans = (rank-1)*100/len; return ans; } }
前缀和即可,查询时就是O(1)复杂度
import java.util.*; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] stu = new int[n]; int[] grade = new int[151]; int[] profix = new int[152]; for (int i = 0; i < n; i++) { stu[i] = in.nextInt(); grade[stu[i]]++; } profix[0] = grade[0]; for (int i = 1; i <= 150; i++) { profix[i] = profix[i - 1] + grade[i]; } int q = in.nextInt(); for (int i = 0; i < q; i++) { int idx = in.nextInt(); double x = (profix[stu[idx - 1]] - 1) / (double)n; System.out.println(String.format("%.6f", x * 100)); } } }
import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 输入同学数 int n = in.nextInt(); in.nextLine(); int[] scores = new int[n]; Map<Integer, Integer> map = new HashMap<>(); Map<Integer, Double> res = new HashMap<>(); for (int i = 0; i < n; i++) { scores[i] = in.nextInt(); map.put(i, scores[i]); } Arrays.sort(scores); for (int i = 0; i < n; i++) { res.put(scores[i], ((double)i / n) * 100); } // 查询组数 int q = in.nextInt(); in.nextLine(); while (q-- > 0) { int x = in.nextInt(); double d = res.get(map.get(x - 1)); System.out.println(String.format("%.6f", d)); } } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int stuNum = Integer.parseInt(in.nextLine()); int[] score = new int[stuNum]; for(int i = 0;i<stuNum; i++){ score[i] = in.nextInt(); } int[] rank = Arrays.copyOf(score,stuNum); Arrays.sort(rank); int[] dp = new int[151]; for(int i = 0;i<stuNum; i++){ dp[rank[i]] = i; } int queryNum = in.nextInt(); for(int i=0;i<queryNum; i++){ int stu = in.nextInt(); int grade = score[stu-1]; double res = dp[grade]*1.0/stuNum * 100; System.out.printf("%.6f\n", res); } } }
import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); //输入数据 int n = input.nextInt(); short[] a = new short[n]; for(int j = 0; j < n; j++){ a[j] = input.nextShort(); } //输入数据 int q = input.nextInt(); int[] x = new int[q]; for(int j = 0; j < q; j++){ x[j] = input.nextInt(); } //创建副本并排序 short[] temp = Arrays.copyOf(a, n); Arrays.sort(temp); //index既是下标索引,又是不大于分数x的总人数 for(int j = 0; j < q; j++){ int index = Arrays.binarySearch(temp, a[x[j] - 1]); for(; index < n; index++) { if(temp[index] > a[x[j] - 1]) break; } double count = index - 1; double res = count / n * 100; System.out.printf("%.6f\n", res); } } }
package com.example.demo.test.neteasy; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.HashMap; import java.util.Scanner; public class T1 { private static int[] score=new int[10001]; private static int[] sortArr=new int[10001]; private static int[] query=new int[10001]; private static HashMap<Integer,Integer> map=new HashMap<>(); private static int n=0;//学生总数 private static int m=0;//询问总数 public static void getRank(){ sort(); double t=0; double ans; for(int i=0;i<m;i++){ t=map.get(score[query[i]-1]); ans=100*(n-t)/n; DecimalFormat df = new DecimalFormat("#0.000000"); String str = df.format(ans); System.out.println(str); } } public static void sort(){ for(int i=0;i<n;i++){ for(int j=0;j<n-1;j++){ if(sortArr[j]<sortArr[j+1]){ swap(j,j+1); } } } for(int i=0;i<n;i++){ // 一开始没看清题目没 A过 吐了 少了个if判断 if(!map.containsKey(sortArr[i])){ map.put(sortArr[i],i+1); } } //System.out.println(); } public static void swap(int i,int j){ int t=sortArr[i]; sortArr[i]=sortArr[j]; sortArr[j]=t; } public static void main(String[] args) { Scanner scanner=new Scanner(System.in); n=scanner.nextInt(); for(int i=0;i<n;i++){ score[i]=scanner.nextInt(); sortArr[i]=score[i]; } m=scanner.nextInt(); for(int i=0;i<m;i++){ query[i]=scanner.nextInt(); } getRank(); } }
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc= new Scanner(System.in); int n= sc.nextInt(); int[] a=new int[n]; for(int i=0;i<n;i++){ a[i]=sc.nextInt(); } int q=sc.nextInt(); int[] x=new int[q]; for(int i= 0;i<q;i++){ x[i]=sc.nextInt(); } int[] count=new int[n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(a[i]>a[j]){ count[i]++; } } } for(int i=0;i<q;i++){ double m=(double) count[i]/n*100; System.out.printf("6.f%",m); } } }
n = int(input())
score = str(input()).split()
score = [int(xi) for xi in score]
cou = int(input())
l = []
for i in range(cou):
l.append(int(input()))
score_sort = sorted(score)
for j in l:
s = score[j-1]
num = score_sort.index(s)
for i in range(num+1, n):
if score_sort[i] == s:
num += 1
else:
break
tmp = 100*num/n
print('%0.6f'%tmp)
from fileinput import input args = [] for line in input(): if line: args.append(list(line.split())) n = args.pop(0) n = int(n[0]) scores = args.pop(0) scores = list(map(float, scores)) q = args.pop(0) q = int(q[0]) scores_sort = sorted(scores) while args: x = args.pop(0) x = int(x[0]) - 1 s = scores[x] num = scores_sort.index(s) for i in range(num+1, n): if scores_sort[i] == s: num += 1 else: break tmp = 100 * num / n print('%.6f' % tmp)
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] nArrays = new int[n]; for(int i=0;i<n;i++){ nArrays[i] = scanner.nextInt(); } int q = scanner.nextInt(); int count = 0; for(int i=0;i<q;i++){ int qArray = nArrays[scanner.nextInt()-1]; for(int j=0;j<n;j++){ if(nArrays[j]<=qArray){ count++; } } System.out.println(String.format("%.6f",(count-1)*100.0/n)); count = 0; } } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); double n = sc.nextDouble();//班级人数n int [] scores = new int[(int)n];//分数数组 for (int i = 0; i < (int)n; i++) { scores[i] = sc.nextInt(); } int q = sc.nextInt();//表示询问的次数 for (int j = 0; j < q; j++) { int x = sc.nextInt(); int s = num(scores[x-1],scores); System.out.println(String.format("%.6f",((s-1)/n)*100));//保留6位小数 四舍五入 } } public static int num(int score,int[] scores){ int k = 0; for (int i : scores) { if(score >= i){ k++; } } return k; } }
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int n = scanner.nextInt();
int[] a = new int[n];
int sum = 0;
for (int i = 0; i < a.length; i++) {
a[i] = scanner.nextInt();
sum += a[i];
}
int q = scanner.nextInt();
int[] x = new int[q];
for (int i = 0; i < x.length; i++) {
x[i] = scanner.nextInt();
}
for (int value : x) {
int s = a[value-1];
int total = 0;
for (int i : a) {
if (i <= s) {
total++;
}
}
double p = (double)(total-1)/n;
System.out.printf("%.6f\n",p*100);
}
}
}
}