1.题目描述
在商城的某个位置有一个商品列表,该列表是由L1、L2两个子列表拼接而成。当用户浏览并翻页时,需要从列表L1、L2中获取商品进行展示。展示规则如下:
- 用户可以进行多次翻页,用offset表示用户在之前页面已经浏览的商品数量,比如offset为4,表示用户已经看了4个商品
- n表示当前页面需要展示的商品数量
- 展示商品时首先使用列表L1,如果列表L1长度不够,再从列表L2中选取商品
- 从列表L2中补全商品时,也可能存在数量不足的情况
请根据上述规则,计算列表L1和L2中哪些商品在当前页面被展示了
- 输入描述:
每个测试输入包含1个测试用例,包含四个整数,分别表示偏移量offset、元素数量n,列表L1的长度l1,列表L2的长度l2。 - 输出描述:
在一行内输出四个整数分别表示L1和L2的区间start1,end1,start2,end2,每个数字之间有一个空格。注意,区间段使用半开半闭区间表示,即包含起点,不包含终点。如果某个列表的区间为空,使用[0,0)表示,如果某个列表被跳过,使用[len,len)表示,len表示列表的长度。 - 输入示例:
2 4 4 4 1 2 4 4 4 1 3 3
- 输出示例:
2 4 0 2 1 3 0 0 3 3 1 2
2.题目解析
实例视图如下:
注意:区间段使用半开半闭区间表示,即包含起点,不包含终点。
3.参考答案
#include <bits/stdc++.h>
using namespace std;
int main(){
int offset = 0; // 偏移量
int n = 0; // 元素数量
int l1 = 0; // 列表L1长度
int l2 = 0; // 列表L2长度
scanf("%d%d%d%d",&offset,&n,&l1,&l2);
int startA;
int endA;
int startB;
int endB;
if (l1 >= offset){// 在L1内
startA = offset;
if (l1 >= offset + n){ // 显示区域完全在L1内
endA = offset + n;
startB = endB = 0;
} else { // 显示区域跨L1、L2
endA = l1;
startB = 0;
if(l2 > offset+n-l1) // 显示区域不超过L2
endB = offset+n-l1;
else // 显示区域超过L2
endB = l2;
}
}else{ // 显示区域只在L2
startA = endA = l1;
if(l2 > offset-l1) // 起始位置在L2内
startB = offset-l1;
else // 起始位置在L2外
startB = l2;
if(l2 > offset+n-l1)// 显示区域不超过L2
endB = offset+n-l1;
else
endB = l2;// 显示区域超过L2
}
printf("%d %d %d %d\n",startA,endA,startB,endB);
}
简化
#include <bits/stdc++.h>
using namespace std;
int main(){
int offset = 0; // 偏移量
int n = 0; // 元素数量
int l1 = 0; // 列表L1长度
int l2 = 0; // 列表L2长度
scanf("%d%d%d%d",&offset,&n,&l1,&l2);
int startA = min(l1,max(0,offset));
int endA = max(0,min(l1,offset+n));
int startB = min(l2,max(0,offset-l1));
int endB = max(0,min(l2,offset+n-l1));
printf("%d %d %d %d\n",startA,endA,startB,endB);
}