首页 > 试题广场 > 小易的英语软件
[编程题]小易的英语软件
  • 热度指数:867 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小易是班级的英语课代表, 他开发了一款软件开处理他的工作。
小易的软件有一个神奇的功能,能够通过一个百分数来反应你的成绩在班上的位置。“成绩超过班级 ...% 的同学”。
设这个百分数为 p,考了 s 分,则可以通过以下式子计算得出 p:
p = ( 分数不超过 s 的人数 - 1) 班级总人数
突然一天的英语考试之后,软件突然罢工了,这可忙坏了小易。成绩输入这些对于字写得又快又好的小易当然没有问题,但是计算这些百分数……这庞大的数据量吓坏了他。
于是他来找到你,希望他编一个程序模拟这个软件:给出班级人数 n,以及每个人的成绩,请求出某几位同学的百分数。

输入描述:
第一行一个整数 n,表示班级人数。 
第二行共 n 个自然数,第 i 个数表示第 i 位同学的成绩 a_i
第三行一个整数 q,表示询问的次数。
接下来 q 行,每行一个数 x,表示询问第 x 位同学的百分数。


输出描述:
输出应有 q 行,每行一个百分数,对应每一次的询问。

为了方便,不需要输出百分号,只需要输出百分号前的数字即可。四舍五入保留六位小数即可。
示例1

输入

3
100 98 87
3
1
2
3

输出

66.666667
33.333333
0.000000
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;
    }
}
题目本身不难,但是调了好久的精度终于AC了
发表于 2020-04-01 16:52:11 回复(0)
对n个数排序后进行统计,注意相同分数的处理
发表于 2020-05-16 12:33:40 回复(0)
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)


编辑于 2020-05-09 21:05:30 回复(0)
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;
    }
}

发表于 2020-04-13 17:53:14 回复(0)
#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;
}

发表于 2020-04-09 21:20:12 回复(0)
importjava.util.*;
publicclassMain {
    publicstaticvoidmain(String[] args) {
        Scanner scanner =newScanner(System.in);
        doublen = scanner.nextFloat();
        int[] a =newint[(int)n];
        for(inti=0;i<n;i++){
            a[i] = scanner.nextInt();
        }
        intq = scanner.nextInt();
        int[] b =newint[q];
        for(inti=0;i<q;i++){
            b[i] = scanner.nextInt();
        }
        for(inti=0;i<q;i++){
            doubletemp = (num(a,b[i])-1)/n*100;
            System.out.printf("%.6f\n",temp);
        }
    }
    publicstaticdoublenum(int[] a,inti){
        doublecount=0;
        for(intj=0;j<a.length;j++){
            if(a[j]<=a[i-1]){count++;}
        }
        returncount;
    }
}
发表于 2020-04-07 17:35:01 回复(0)
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;
        }
    }
}

发表于 2020-04-07 12:17:56 回复(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;
    }
}

发表于 2020-04-05 18:41:25 回复(0)
比较简单。直接遍历成绩数组,把小于等于目标成绩的人数记录后便可求解。

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

编辑于 2020-04-04 21:06:12 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    private static Scanner sc;

    public static void main(String[] args) {
        sc = new Scanner(System.in);
        int n = sc.nextInt();//班级人数
        int[] scores = new int[n];
        int[] scoresSort = new int[n];
        for (int i = 0; i < n; i++) {
            scores[i] = sc.nextInt();//统计分数
            scoresSort[i] = scores[i];
        }
        Arrays.sort(scoresSort);
        int q = sc.nextInt();
        int[] query = new int[q];
        for (int i = 0; i < query.length; i++) {
            query[i] = sc.nextInt();
        }
        for (int i = 0; i < q; i++) {
            int x = query[i] - 1;//查询的分数的索引
            int score = scores[x];
            int index = bfind(scoresSort, score);
            double p;
            if (index == n - 1) {
                if(score >= scoresSort[n-1]){
                    p = (((double) (n - 1)) / n) * 100;
                }else{
                    p = (((double) (index - 1)) / n) * 100;
                }
            }else {
                p = (((double) (index - 1)) / n) * 100;
            }
            System.out.printf("%.6f\n", p);
        }
    }

    private static int bfind(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int m = l + (r - l) / 2;
            if (nums[m] <= target) {
                l = m + 1;
            } else {
                r = m;
            }
        }
        return l;
    }
}

发表于 2020-04-04 01:14:31 回复(0)
import java.util.*;
public class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] a = new int[n];
    int[] sorta= new int[n];
    for(int i=0;i<n;i++){
      a[i]=sc.nextInt();
      sorta[i]=a[i];
    }
    int query = sc.nextInt();
    int[] idx = new int[query];
    for(int i=0;i<query;i++){
      idx[i]=sc.nextInt();
    }
    Arrays.sort(sorta);
    for(int i=0;i<query;i++){
      double res =0;
      int score = a[idx[i]-1];
      for(int j=0;j<n;j++){
        if(sorta[j]>score){
          res=(double)(j-1)/n*100;
          break;
        }
        if(j==n-1){
          res = (double)(n-1)/n*100;
        }
      }
      System.out.println(String.format("%.6f",res));
    }
  }
}

发表于 2020-04-03 22:55:41 回复(0)
n = int(input())
grades = list(map(int,input().split()))
n_c = int(input())
student_c = []
for i in range(n_c):
    student_c.append(int(input()))
grades_c = []
for i in student_c:
    grades_c.append(grades[i-1])
grades_s = sorted(grades)
dic = {}
for i,j in enumerate(grades_s):
    dic[j]=i
for i in student_c:
    percent = str(round(dic[grades[i-1]]/n*10**8)/10**6)
    temp = percent.split('.')
    #print(percent) print放在这就可已提交,虽然答案位数不对
    decimal = temp[1]
    interger = temp[0]
    while len(decimal)<6:
        decimal+='0'
        percent+='0'
    print(percent) (3630)#print放在这就说输出格式不对,妈的都是字符串啊
    print('\n')

服了牛客每次输入输出都占的时间比写程序本身大多了
发表于 2020-03-25 14:05:24 回复(0)
importjava.text.DecimalFormat;
importjava.util.*;
 
publicclassMain {
    publicstaticvoidmain(String args[]) {
        Scanner scanner = newScanner(System.in);
        while(scanner.hasNext()) {
            intnum = scanner.nextInt();
            HashMap<Integer, Integer> map = newHashMap();
            int[] scores = newint[num + 1];
            for(inti = 0; i < num; i++) {
                intnow = scanner.nextInt();
                map.put(now, map.getOrDefault(now, 0) + 1);
                scores[i + 1] = now;
            }
            ArrayList<Map.Entry<Integer, Integer>> list = newArrayList(map.entrySet());
            Collections.sort(list, newComparator<Map.Entry<Integer, Integer>>() {
                @Override
                publicintcompare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                    returno1.getKey() - o2.getKey();
                }
            });
            intcount = scanner.nextInt();
            for(inti = 0; i <count; i++) {
                intindex = scanner.nextInt();
                intscore = scores[index];
                doubleans = 0;
                for(Map.Entry e : list) {
                    if((int)e.getKey()>score){
                        break;
                    }else{
                        ans += (int)e.getValue() ;
                    }
                }
                ans = ans -1;
                System.out.println(newDecimalFormat("0.000000").format(ans*100/num));
            }
        }
    }
}
发表于 2020-03-22 12:42:19 回复(0)
99个用例的时候精度一直不正确,我实在想不到还有什么方法可以增加精度了,有通过的大佬吗?一起交流下?
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];
		int barrel[] = new int [151];	// 桶
		
		for(int i = 0; i < n; i++) {
			a[i] = scan.nextInt();
			barrel[a[i]]++;
		}
		int q = scan.nextInt();
		int b[] = new int [q];
		for(int i = 0; i < q; i++) {
			b[i] = scan.nextInt();
		}
		scan.close();
		
		for(int i = 0; i < q; i++) {
			int score = a[b[i] - 1];
			int lowerCount = 0;
			for(int j = 0; j < score; j++) {
				lowerCount += barrel[j];
			}
			double awibof = 100.0 * (double)lowerCount / (double)n;
			System.out.printf("%.6f\n", awibof);
		}
	}
}


发表于 2020-03-13 23:14:26 回复(1)