解题思路:

排序+枚举

注意事项:

考试时候想得太复杂了。。。用了权值线段树去暴力模拟,果然TLE。

本题首先需要对输入按值降序排序,之后可以看做不断将对称轴后的数向前插入,当然,为了节约时间,可以直接插入至对称轴处。

为此,我们需要判断插入到对称轴之前才满足条件,还是插入到与对称轴相同就满足条件(注意,插入时后面有一个数已经被取缔了需要-1)

此外,要注意对称轴可能由多个相同的数组成,因此需要判断边界。

参考代码:

import java.io.*;
import java.util.*;
public class Main {
    static class Pair implements Comparable<Pair>{
        int index;
        int value;

        Pair(int value, int index){
            this.value = value;
            this.index = index;
        }

        public int compareTo(Pair other){
            return  other.value - this.value;
        }
    }
    static StreamTokenizer cin;
    static PrintWriter out;
    static int N;  // 学生总数
    static Pair[] arr;
    static int[] res;
    public static void main(String[] args) throws IOException{
        cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        out = new PrintWriter(new OutputStreamWriter(System.out));
        N = nextInt();
        arr = new Pair[N];
        res = new int[N];
        for(int i = 0; i < N; i++){
            int num = nextInt();
            arr[i] = new Pair(num, i);
        }

        Arrays.sort(arr);  // 降序
        int axis = N%2==0?N/2-1:N/2;  // 初始化对称轴
        int axisV = arr[axis].value;
        int s = axis;
        int e = axis;
        for(; s!=-1 && arr[s].value==axisV; s--);
        for(; e!=N && arr[e].value==axisV; e++);
        boolean flag = false;
        int bigger = s+1;
        int smaller = N-e;
        if(bigger <= smaller)
            flag = true;  // 对称轴附近不需要更改
        int index = e;
        if(!flag)
            index = s+1;
        for(int i = index; i < N; i++){
            if(s+1 <= N-e-1){
                res[arr[i].index] = arr[axis].value-arr[i].value;
            }else{
                res[arr[i].index] = arr[axis].value-arr[i].value+1;
            }
        }
        boolean first = true;
        for(int i = 0; i < N; i++){
            if(first){
                out.print(res[i]);
                first = false;
                continue;
            }
            out.print(" "+res[i]);
        }
        out.flush();
        out.close();



    }

    static int nextInt() throws IOException{
        cin.nextToken();
        return (int)cin.nval;
    }
}


点赞(0)
 

0.0分

18 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

mxw 9月前 回复TA
@黄油大可颂 只能说写了个几把
黄油大可颂 10月前 回复TA
这也算优质题解