AcWing 4665. 最少刷题数
原题链接
简单
作者:
两生
,
2023-03-19 14:00:13
,
所有人可见
,
阅读 193
import java.io.*;
import java.util.*;
public class Main {
static int N = 100010;
static int a[] = new int[N], t[] = new int[N];
static int n;
public static boolean check(int x, boolean loop){
int l = 0, r = n - 1;
// 找到最大的小于x的下标,二分右端点 +1
while(l < r){
int mid = l + r + 1 >> 1;
if(a[mid] < x) l = mid; // 可能取小了
else r = mid - 1; // 一定取大了
}
int il = r;
if(a[il] >= x) il = 0; // 不存在小于x的值
else il = r + 1; // 存在小于x的值,且有il个
if(loop) il -= 1; // 如果需要多刷题,那么x就会变多,就会大于它的原来值,在小于它的值中不能包含这个原来值
// 找到最小的大于x的下标,二分左端点
l = 0; r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(a[mid] > x) r = mid; // 可能取大了
else l = mid + 1; // 一定取小了
}
int ir = r;
if(a[r] <= x) ir = 0; // 不存在大于x的值
else ir = n - r; // 存在大于x的值,且有ir个
if(ir <= il) return true;
else return false;
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StreamTokenizer stmInput = new StreamTokenizer(br);
stmInput.nextToken();
n = (int)stmInput.nval;
for(int i = 0; i < n; i++){
stmInput.nextToken();
a[i] = (int)stmInput.nval;
t[i] = a[i];
}
Arrays.sort(a, 0, n);
for(int i = 0; i < n; i++){
int l = 0, r = a[n - 1];
while(l < r){
int mid = l + r >> 1;
boolean loop = true; // 默认需要多刷题
if(mid == 0) loop = false;
if(check(mid + t[i], loop)) r = mid; // 可能取大了
else l = mid + 1; // 一定取小了
}
bw.write(l + " ");
}
bw.flush();
bw.close();
br.close();
}
}