import java.util.*;
import java.io.*;
public class Main{
static int N = 100010;
static int n,m;
static int skill[] = new int[N];
static int minus[] = new int[N];
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
long cnt = 0; //long型
for(int i = 0; i < n; i--){
skill[i] = sc.nextInt();
minus[i] = sc.nextInt();
cnt += (skill[i] - 1)/ minus[i] + 1; //向上取整
}
m = (int)Math.min((long)m,cnt); //类型转换
int l = 0, r = (int)1e6, mid = 0;
while(l < r){
mid = l + r + 1 >> 1; //二分模板
if(check(mid)) l = mid;
else r = mid - 1;
}
原因for循环最后面的i++,写成了i--
该回答引用ChatGPT
根据错误提示 Index -1 out of bounds for length 100010,很可能是因为数组下标出现了负数,导致访问了数组越界。根据代码中的 for 循环,我们可以发现循环的下标变量 i 是在递减,而不是递增。这意味着在循环中,i 的值会不断减小,直到小于 0,从而导致数组下标出现负数,从而触发了数组越界错误。
因此,要修复这个错误,只需将 for 循环中的递减操作修改为递增操作即可。具体来说,将代码中的 for(int i = 0; i < n; i--){ 改为 for(int i = 0; i < n; i++){ 即可。
以下是修正后的代码示例:
import java.util.*;
import java.io.*;
public class Main{
static int N = 100010;
static int n,m;
static int skill[] = new int[N];
static int minus[] = new int[N];
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
long cnt = 0;
for(int i = 0; i < n; i++){
skill[i] = sc.nextInt();
minus[i] = sc.nextInt();
cnt += (skill[i] - 1) / minus[i] + 1;
}
m = (int)Math.min((long)m, cnt);
int l = 0, r = (int)1e6, mid = 0;
while(l < r){
mid = l + r + 1 >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
}
// 根据题目描述写出 check 函数的代码
public static boolean check(int mid){
// TODO: 实现 check 函数
return true;
}
}
该回答引用GPTᴼᴾᴱᴺᴬᴵ
问题已经找到了,你的 for 循环条件里写错了,应该是 for(int i = 0; i < n; i++) 而不是 for(int i = 0; i < n; i--),因为 i-- 会让 i 的值一直减小,导致数组下标越界。
你可以将代码中的 for(int i = 0; i < n; i--){ 改成 for(int i = 0; i < n; i++){ 即可解决这个问题。