最少刷题数

最少刷题数

题目分析

对于每一名同学计算还需要再刷多少题才能保证刷题数比他多的人数不超过刷题数比他少的学生人数。我们可以考虑统计每一个分数的前缀和数组,sum[i]表示当前学生中,刷题数小于等于i的人数。那么对于学生i的刷题数a[i],sum[a[i]-1]表示刷题数比该同学少的人数,n-sum[a[i]]+1表示刷题数比该同学多的人数,这里的+1是因为减掉了该同学本身,所以要再加回来。我们可以通过sum[a[i]-1]与n-sum[a[i]]的大小来判断该学生是否需要再刷题。

如果sum[a[i]-1]>=n-sum[a[i]],说明该同学不需要再刷题,

如果sum[a[i]-1]<n-sum[a[i]],说明该同学需要再刷题,那么需要刷多少道题呢?我们只需要找到满足sum[x-1]>=n-sum[x]的最小的x就可以了。其实这个x是固定的,那么我们要怎么找这个x呢?就是遍历一遍sum数组即可。

寻找满足sum[pos-1]>=n-sum[pos]的最小的pos

for(int i = 1;i <= maxn;i++) {
    if(cnt[i-1]-1>=n-cnt[i]) {
        pos = i;
        break;
    }
}

遍历所有学生的刷题数,如果sum[a[i]-1]>=n-sum[a[i]],说明该同学不需要再刷题,打印0,否则打印当前刷题数和pos之间的差值。

for(int i = 1 ; i <= n ; i ++) {
    if(a[i]==0) System.out.print(pos-a[i] + " ");//注意刷题数为0时要特判不然会数组越界
    else {
        if(cnt[a[i]-1]>=n-cnt[a[i]]) 
        System.out.print(0 + " ");
        else
        System.out.print(pos-a[i] + " ");
	}
}

题目代码

import java.io.*;
public class Main {
    static final int N = 100000 ;
    public static void main(String[] args) throws IOException {
        StreamTokenizer in= new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        in.nextToken() ;
        int n = (int)in.nval ;
        int a[] = new int[n + 1] ;
        int cnt[] = new int[N + 1] ;
        int maxn = 0 ;
        for(int i = 1 ; i <= n ; i ++) {
            in.nextToken();
            a[i] = (int)in.nval ;
            cnt[a[i]] ++ ;
            maxn = Math.max(maxn , a[i]) ;
        }
        for(int i = 1 ; i <= maxn ; i ++) {
            cnt[i] += cnt[i - 1] ;
        }
        int pos = -1;
        for(int i = 1;i <= maxn;i++) {
        	if(cnt[i-1]-1>=n-cnt[i]) {
        		pos = i;
        		break;
        	}
        }
        for(int i = 1 ; i <= n ; i ++) {
        	if(a[i]==0) System.out.print(pos-a[i] + " ");//注意刷题数为0时要特判不然会数组越界
        	else {
        		if(cnt[a[i]-1]>=n-cnt[a[i]]) 
            	  System.out.print(0 + " ");
                else
				  System.out.print(pos-a[i] + " ");
          }
        }
    }
}

相关推荐

  1. 最少

    2024-03-14 19:42:01       42 阅读
  2. ·链表】两相加

    2024-03-14 19:42:01       67 阅读
  3. 蓝桥杯-星星

    2024-03-14 19:42:01       38 阅读
  4. LeetCode--- 完全平方

    2024-03-14 19:42:01       34 阅读
  5. leetcode:两之和

    2024-03-14 19:42:01       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 19:42:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 19:42:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 19:42:01       82 阅读
  4. Python语言-面向对象

    2024-03-14 19:42:01       91 阅读

热门阅读

  1. 工作随记:oracle重建一张1T数据量的大表

    2024-03-14 19:42:01       46 阅读
  2. c#计算闰年

    2024-03-14 19:42:01       35 阅读
  3. 基于ElasticSearch的海量AIS数据存储方法

    2024-03-14 19:42:01       44 阅读
  4. 【Python】-闲聊:如何系统的自学Ptyhon

    2024-03-14 19:42:01       45 阅读
  5. PHP序列化基础知识储备

    2024-03-14 19:42:01       37 阅读
  6. Oracle——用户、角色、权限的创建、删除、修改

    2024-03-14 19:42:01       41 阅读
  7. day2-C++

    day2-C++

    2024-03-14 19:42:01      31 阅读
  8. 当代计算机语言占比分析

    2024-03-14 19:42:01       50 阅读
  9. 文件系统事件监听

    2024-03-14 19:42:01       43 阅读
  10. 【OpenGL经验谈01】Vertex 规范最佳实践

    2024-03-14 19:42:01       41 阅读
  11. SpringCloud中Gateway提示OPTIONS请求跨域问题

    2024-03-14 19:42:01       41 阅读
  12. 如何详细自学python?

    2024-03-14 19:42:01       41 阅读