L2-057 姥姥改作业 - java

L2-057 姥姥改作业


语言 时间限制 内存限制 代码长度限制 栈限制
Java (javac) 600 ms 512 MB 16KB 8192 KB
Python (python3) 400 ms 256 MB 16KB 8192 KB
其他编译器 400 ms 64 MB 16KB 8192 KB

题目描述:

在没有拼题 A 的很久很久以前,姥姥不得不人工批改学生们交上来的大量作业。有些学生的作业写得实在太乱了,姥姥一眼看到就血压飙升,赶紧放到一边,等冷静下来再说...... 简而言之面对 n n n 本学生作业,姥姥批改作业的策略是这样的:

  • 为每一本作业定义一个"混乱指数" c i ( i = 1 , ⋯ , n ) c_i(i=1,⋯,n) ci(i=1,⋯,n);
  • 为自己定义一个不可以接受的混乱指数阈值 T T T;
  • 当看到一本作业的 c i > T c_i > T ci>T,则先放到一边,即将这个作业本叠放在自己左右手边的作业本堆 S 左 S_左 S左上;
  • 对于 c i ≤ T c_i \le T ci≤T 的作业,批改之后叠放在自己左右手边的作业本堆 S 右 S_右 S右上;
  • 当面前没有待批改的作业本时,如果左手边还有一堆作业本,则调整自己的阈值 T T T 为这堆作业的混乱指数的平均值的一半,即 T = ⌊ ∑ c i ∈ S 左 c i / n 左 ⌋ T = \left \lfloor \sum_{c_{i} \in S_{左}}{c_{i} / n_{左}} \right \rfloor T=⌊∑ci∈S左ci/n左⌋,其中 n 左 n_左 n左为 S 左 S_左 S左 中作业本的数量。然后开始批改。
  • 重复上述步骤,直到所有作业都被批改完成。

问:姥姥批改作业的顺序是怎样的?

声明:本题仅限人类解答。

输入格式:

输入第一行给出 2 2 2 个不超过 10 3 10^3 103的正整数: n n n 为作业本的数量, T T T 为姥姥可以接受的混乱指数阈值。随后一行给出 n n n 个不超过 10 3 10^3 103 的非负整数,按原始作业堆自顶向下的顺序,第 i i i 个数字对应编号为 i i i 的作业的混乱指数 ( i = 1 , ⋯ , n ) (i=1,⋯,n) (i=1,⋯,n)。同行数字间以一个空格分隔。

输出格式:

按照姥姥批改作业的顺序,在一行中输出每个作业本的编号。数字间以一个空格分隔,行首尾不得有多余空格。

输入样例:

10 2

233 8 1 6 0 745 2 555 42 3

输出样例:

3 5 7 10 9 4 2 1 8 6


  1. 在一堆作业中去看其混论指数 c i c_i ci与自己可以接受的混乱指数阈值 T T T。
    • 如果 c i > T c_i > T ci>T, 那么就表示当前这个作业暂时无法接受,需要放在左侧,等下再批改
    • 否则 c i < = T c_i <= T ci<=T, 那么就表示当前这个作业可以接受,那么把他放在右侧
  2. 然后再去看所有左侧未批改的作业中,重新设置自己的阈值 T T T为未批改作业的混乱指数的平均值
    • 阈值 T = ⌊ ∑ c i ∈ S 左 c i / n 左 ⌋ = ⌊ ( ∑ c i ∈ S 左 c i ) / n 左 ⌋ T = \left \lfloor \sum_{c_{i} \in S_{左}}{c_{i}} / n_{左} \right \rfloor = \left \lfloor (\sum_{c_{i} \in S_{左}}{c_{i}} ) / n_{左} \right \rfloor T=⌊∑ci∈S左ci/n左⌋=⌊(∑ci∈S左ci)/n左⌋
  3. 然后重复上述操作,直至所有作业全都批改完
  4. 最后依次输出批改作业的顺序

emmmmmmm

按照题目意思模拟即可。

  • 列表q :存储所有为批改的作业
  • 栈st :存储当前阈值为 T T T时,超过阈值 T T T的所有作业
  • 列表list: 存储当前批改作业的顺序
  1. 依次遍历 列表q 中所有的作业
    • 如果 当前作业的混乱指数 c i c_i ci 与 自己的阈值 T T T
      • 其中 c i > T c_i > T ci>T 的内容放入到 栈st
      • 其中 c i < = T c_i <= T ci<=T 的内容放入到 列表list
    • 遍历完所有作业时,就表示所有作业都批改过,那么就清空 列表q 的所有内容。
  2. 如果 栈st 中还有元素,那么将 栈st 中的元素依次放入到 列表q 中 并 计算其累加和,求的平均值

java 复制代码
import java.io.PrintWriter;
import java.util.*;

public class Main
{
    static class edge
    {
        int c, id; // 存储当前作业的混乱指数与编号

        public edge(int c, int id)
        {
            this.c = c;
            this.id = id;
        }
    }

    static Stack<edge> st = new Stack<>(); // 存储当前超过阈值的作业
    static List<edge> q = new LinkedList<>(); // 存储当前未超过阈值的作业
    static List<edge> list = new ArrayList<>(); // 存储批改作业的顺序

    static void solve(int t)
    {
        for (edge u : q) // 依次遍历所有为批改的作业
        {
            if (u.c <= t) list.add(u);
            else st.push(u);
        }
        q.clear(); // 清空未批改的作业
    }

    static int get()
    {
        int ans = 0; // 统计无法批改作业的混乱指数和
        int cnt = 0; // 统计无法批改作业的个数
        while (!st.isEmpty()) // 遍历所有无法批改的作业
        {
            edge u = st.pop(); // 取出一个无法批改的作业
            q.add(u); // 添加到未批改的作业中
            ans += u.c;
            cnt++;
        }
        return ans / cnt;
    }


    public static void main(String[] args)
    {
        int n = sc.nextInt(), t = sc.nextInt();
        for (int i = 1; i <= n; i++)
        {
            int c = sc.nextInt();
            q.add(new edge(c, i)); // 添加未批改的作业
        }

        while (!q.isEmpty()) // 如果存在未批改的作业
        {
            solve(t);

            if (st.isEmpty()) break; // 如果没有无法批改的作业,则退出循环

            t = get(); // 获取无法批改作业的混乱指数的平均值
        }

        for (int i = 0; i < list.size(); i++)
        {
            if (i != 0) out.print(" ");
            out.print(list.get(i).id);
        }

        out.flush();
        out.close();
    }

    static Scanner sc = new Scanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);
}

ArrayList
ArrayList

Stack
Stack
Stack


如果有说错的 或者 不懂的 尽管提 嘻嘻

一起进步!!!


闪现
天梯赛

相关推荐
将心ONE1 小时前
pathlib Path函数的使用
java·linux·前端
l1t1 小时前
duckdb excel插件和rusty_sheet插件在python中的不同表现
开发语言·python·excel
Royzst1 小时前
常用APL
java
人道领域1 小时前
【黑马点评日记】高并发秒杀:库存超卖与锁机制解析
java·开发语言·redis·spring·intellij-idea
Java成神之路-1 小时前
面试题:Spring事务失效场景
java·spring
阿亮爱学代码2 小时前
日期与滚动视图
java·前端·scrollview
java1234_小锋2 小时前
说说MyBatis的工作原理吗?
java·mybatis
恶猫2 小时前
自动拨号换ip软件简单实现。aardio版。
java·网络·aardio·adsl·换ip·rasphone.exe·rasdial.exe
lsx2024062 小时前
《jEasyUI 创建树形下拉框》
开发语言