| 语言 | 时间限制 | 内存限制 | 代码长度限制 | 栈限制 |
|---|---|---|---|---|
| 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
- 在一堆作业中去看其混论指数 c i c_i ci与自己可以接受的混乱指数阈值 T T T。
- 如果 c i > T c_i > T ci>T, 那么就表示当前这个作业暂时无法接受,需要放在左侧,等下再批改
- 否则 c i < = T c_i <= T ci<=T, 那么就表示当前这个作业可以接受,那么把他放在右侧
- 然后再去看所有左侧未批改的作业中,重新设置自己的阈值 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左⌋
- 然后重复上述操作,直至所有作业全都批改完
- 最后依次输出批改作业的顺序
emmmmmmm
按照题目意思模拟即可。
- 列表q :存储所有为批改的作业
- 栈st :存储当前阈值为 T T T时,超过阈值 T T T的所有作业
- 列表list: 存储当前批改作业的顺序
- 依次遍历 列表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 的所有内容。
- 如果 当前作业的混乱指数 c i c_i ci 与 自己的阈值 T T T
- 如果 栈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);
}
如果有说错的 或者 不懂的 尽管提 嘻嘻
一起进步!!!