解题思路

这是一道关于分页展示的区间计算问题,需要计算两个列表L1和L2在当前页面的展示区间。主要思路如下:

  1. 对于L1列表:

    • 起始位置:
    • 结束位置:
  2. 对于L2列表:

    • 起始位置:
    • 结束位置:

关键点:

  • 需要考虑offset可能超过L1长度的情况
  • 需要考虑分页长度n可能超过列表总长度的情况
  • 使用 确保不会出现负数索引
  • 使用 确保不会超过列表长度

代码

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int offset, n, l1, l2;
    while (cin >> offset >> n >> l1 >> l2) {
        // L1的区间
        int start1 = min(l1, offset);
        int end1 = min(l1, offset + n);
        
        // L2的区间
        int start2 = min(max(offset - l1, 0), l2);
        int end2 = min(max(offset + n - l1, 0), l2);
        
        cout << start1 << " " << end1 << " " 
             << start2 << " " << end2 << endl;
    }
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int offset = sc.nextInt();
            int n = sc.nextInt();
            int l1 = sc.nextInt();
            int l2 = sc.nextInt();
            
            // 计算L1的区间
            int start1 = Math.min(l1, offset);
            int end1 = Math.min(l1, offset + n);
            
            // 计算L2的区间
            int start2 = Math.min(Math.max(offset - l1, 0), l2);
            int end2 = Math.min(Math.max(offset + n - l1, 0), l2);
            
            System.out.printf("%d %d %d %d\n", start1, end1, start2, end2);
        }
    }
}
while True:
    try:
        offset, n, l1, l2 = map(int, input().split())
        
        # 计算L1的区间
        start1 = min(l1, offset)
        end1 = min(l1, offset + n)
        
        # 计算L2的区间
        start2 = min(max(offset - l1, 0), l2)
        end2 = min(max(offset + n - l1, 0), l2)
        
        print(start1, end1, start2, end2)
    except EOFError:
        break

算法及复杂度

  • 算法:简单的数学计算
  • 时间复杂度: - 每组输入只需要进行简单的数学运算
  • 空间复杂度: - 只需要存储几个整数变量