解题思路:
排序+枚举
注意事项:
考试时候想得太复杂了。。。用了权值线段树去暴力模拟,果然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分
18 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复