题目:
简单来说 就是给一个数字 n
,然后数字l1
在一个区间,l2
在一个区间
求出l1和l2不同组合 和为n的数量。
题解:
A题(easy)
因为数据范围比较小,所以随便写个循环,直接遍历也能过
或者稍微加一些小优化遍历也可以
#include<bits/stdc++.h>
using namespace std;
int main(){
long long t,l1,r1,l2,r2,n,count;
cin>>t;
for(long long i=0;i<t;i++){
count=0;
cin>>n>>l1>>r1>>l2>>r2;
for(long long j=l1;j<=r1;j++){
if(n-j>=l2&&n-j<=r2)count++;
}
cout<<count<<endl;
}
}
B题(medium)
数据范围非常大,遍历必TLE,所以就需要采取一些数学办法解决,
这里的题解由这位老哥提供,所以博主就解释一下他的题解
#include <iostream>
using namespace std;
int main() {
long long int t, n, l1, l2, r1, r2;
cin>>t;
while (t--) {
cin>>n;
cin>>l1>>r1;
cin>>l2>>r2;
//这里不难理解,两个的范围最小和超出n,最大和小于n,直接出0
if(l1+l2>n||r1+r2<n){
cout<<"0"<<endl;
}else{
//这里是重点
//n-r2为在l1~r1范围内 满足和为n的最小左点
//n-l2为在l1~r1范围内 满足和为n的大右点
//然后求l1和n-r2的最大值,将区间往右缩,
//r1和n-l2的最小值,区间往左缩,
//然后求差绝对值再加一 既是答案
cout<<abs(max(l1,n-r2)-min(n-l2,r1))+1<<endl;
}
}
}