简单模拟。
1 2 3 4 5 6 7 public  static  void  solve ()  {    int  n  =  io.nextInt(), x = io.nextInt(), max = 0 ;     for  (int  i  =  1 ; i < n; i++) {         max = Math.max(max, io.nextInt());     }     io.println(Math.max(max - x + 1 , 0 )); } 
 
如果 \(A\)  比 \(B\)  强,则让 \(B\)  的入度加一,最后入度为零的程序员就是最强的,如果多于一个那么返回 \(-1\) 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public  static  void  solve ()  {    int  n  =  io.nextInt(), m = io.nextInt();     int [] in = new  int [n + 1 ];     for  (int  i  =  0 ; i < m; i++) {         int  u  =  io.nextInt(), v = io.nextInt();         in[v]++;     }     int  ans  =  0 , cnt = 0 ;     for  (int  i  =  1 ; i <= n; i++) {         if  (in[i] == 0 ) {             ans = i;             cnt++;         }     }     io.println(cnt == 1  ? ans : -1 ); } 
 
假设我们将数组 \(A\)  执行最少操作后得到数组 \(B\) ,那么 \(\frac{\sum_{i=1}^{N}|A_{i}-B{i}|}{2}\)  就是最小操作次数,因为必定有 \(\sum_{i=1}^{N}A_{i}=\sum_{i=1}^{N}B_{i}\) ,所以上述公式一定可以被二整除。题目要求 \(B\)  的最大值和最小值的差最多为一,那么 \(B\)  一定由 \(N-r\)  个 \(p\) ,以及 \(r\)  个 \(p+1\)  组成,其中 \(p=\frac{\sum_{i=1}^{N}B_{i}}{N},r=\sum_{i=1}^{N}B_{i}\bmod N\) 。然后问题就变为如何组织 \(A_{i}\)  和 \(B_{i}\)  的对应关系,使得 \(\frac{\sum_{i=1}^{N}|A_{i}-B{i}|}{2}\)  最小。显然对数组 \(A\)  进行升序排序,那么数组 \(B\)  的 \(N-r\)  个 \(p\)  对应 \(A\)  的前 \(N-r\)  个元素,数组 \(B\)  的 \(r\)  个 \(p+1\)  对应 \(A\)  的后 \(r\)  个元素,这样排列会使得操作次数最小。
PS:比赛时没什么思路,猜了个平均数,然后没有排序通过遍历比较大小来计算操作次数,结果和正解殊途同归了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public  static  void  solve ()  {    int  n  =  io.nextInt();     long  sum  =  0L ;     int [] arr = new  int [n];     for  (int  i  =  0 ; i < n; i++) {         arr[i] = io.nextInt();         sum += arr[i];     }          Arrays.sort(arr);     long  ans  =  0L , p = sum / n, r = sum % n;     for  (int  i  =  0 ; i < n; i++) {         ans += Math.abs(arr[i] - (p + (i >= n - r ? 1  : 0 )));     }     io.println(ans / 2 ); } 
 
每次查询的返回值可以看作 \(A_{x_{1}}\oplus A_{x_{2}}\oplus \cdots \oplus A_{x_{k}}\) ,所以我们可以首先对前 \(k+1\)  个数进行 \(k+1\)  次查询,然后把所有查询结果异或,可以得到前 \(k+1\)  个数的异或值(因为在 \(k+1\)  次查询中,每个数出现 \(k\)  次,并且 \(k\)  是奇数),将该异或值分别与之前的查询结果异或,可以得到前 \(k+1\)  个数的值。之后的操作类似,就是查询然后异或,得到后面的所有值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 public  static  void  solve ()  {    int  n  =  io.nextInt(), k = io.nextInt(), xor = 0 ;     List<Integer> aux;     int [] ans = new  int [n];     for  (int  i  =  0 ; i <= k; i++) {         aux = new  ArrayList <>();         for  (int  j  =  0 ; j <= k; j++) {             if  (i != j) aux.add(j);         }         ans[i] = query(aux);         xor ^= ans[i];     }     for  (int  i  =  0 ; i <= k; i++) ans[i] ^= xor;     xor ^= ans[k] ^ ans[k - 1 ];     aux = new  ArrayList <>();     for  (int  i  =  0 ; i < k; i++) aux.add(i);     for  (int  i  =  k + 1 ; i < n; i++) {         aux.set(k - 1 , i);         ans[i] = query(aux) ^ xor;     }     io.print("! " );     for  (int  i  =  0 ; i < n; i++) {         io.print(ans[i] + " " );     }     io.println(); } private  static  int  query (List<Integer> aux)  {    io.print("? " );     for  (int  x : aux) {         io.print(x + 1  + " " );     }     io.println();     io.flush();     return  io.nextInt(); }