eption: Index -1 out of bounds for length 100010 at Main.main(Main.java:16)

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++){ 即可解决这个问题。