5 条题解
-
2
#include <stdio.h> #define N 100005 int main() { int t; scanf("%d", &t); while (t--) { long long n, l, r; scanf("%lld %lld %lld", &n, &l, &r); long long pre[N] = {0}; //定义前缀和数组 for (int i = 1; i <= n; ++i) { scanf("%lld", &pre[i]); pre[i] += pre[i - 1]; } long long ans = 0; int start = 0; for (int end = 1; end <= n; ++end) { while (start < end && pre[end] - pre[start] > r) { start++; } if (start < end && pre[end] - pre[start] >= l) { ans++; start = end; } } printf("%lld\n", ans); } return 0; } -
1
#include<stdio.h> int main(){ int t; scanf("%d",&t); while(t--){ long long n,l,r,a[100009]={0},b[100009]={0},ans=0; scanf("%lld%lld%lld",&n,&l,&r); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); b[i]=a[i]+b[i-1]; } int start=0,end=1; for(;end<=n;end++){ while(start<end&&b[end]-b[start]>r){ start++; } if(b[end]-b[start]<=r&&b[end]-b[start]>=l){ ans++;start=end; } } printf("%lld\n",ans); } }//不知道为什么只能用前缀和才能过 -
1
我叶梓楣也要成为duck大魔王!!!(2)
这道题的话 就是给我们一些数字嘛 然后按照这个数字的顺序 我们去考虑 最多有多少个符合的区间 那我们最贪心的去想肯定是只要满足 我们就重新开一个区间嘛 所以我们就想到了 我们用双指针 去维护 如果大于r了 就左指针右移 缩小一点 如果小于l 那就右指针移动 扩大一点 然后就可以了 双指针还是挺常用的一种思想吧 大家多做题 就会有些感觉 比如 这道题 维护一个[l,r]的区间 维护区间 我们就想到会不会是双指针
#include <bits/stdc++.h> using namespace std; #define int long long #define endl '\n' #define EPS 1e-8 #define fi first #define se second #define lowbit(x) x & (-x) const int inf = 0x3f3f3f3f; typedef pair<int, int> pii; const int N = 2E5 + 10; int arr[N]; void solve() { int n, l, r; cin >> n >> l >> r; int vec[n+1]={0}; for (int i = 1; i <= n; i++) { cin >> vec[i]; } int ll = 0, rr = 0; int ans = 0, sum = 0; while (ll <= n && rr <= n) { if (sum <= r && sum >= l) { ans++; ll = rr + 1; sum = 0; } else if (sum < l) { rr++; sum += vec[rr]; } else if (sum > r) { sum -= vec[ll]; ll++; } } cout << ans << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; cin >> t; while (t--) { solve(); } return 0; } -
1
#include <bits/stdc++.h> using namespace std; #define int long long #define endl '\n' #define EPS 1e-8 #define fi first #define se second #define lowbit(x) x & (-x) const int inf = 0x3f3f3f3f; typedef pair<int, int> pii; const int N = 2E5 + 10; int arr[N]; void solve() { int n, l, r; cin >> n >> l >> r; int vec[n+1]={0}; for (int i = 1; i <= n; i++) { cin >> vec[i]; } int ll = 0, rr = 0; int ans = 0, sum = 0; while (ll <= n && rr <= n) { if (sum <= r && sum >= l) { ans++; ll = rr + 1; sum = 0; } else if (sum < l) { rr++; sum += vec[rr]; } else if (sum > r) { sum -= vec[ll]; ll++; } } cout << ans << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; cin >> t; while (t--) { solve(); } return 0; } -
1
#include<iostream> #include<algorithm> using namespace std; #define ll long long
int main() { ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t,n,l,r;
cin>>t;
while(t--){
cin>>n>>l>>r;
ll a[n+10],b[n+10]={0},ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>r){
b[i]=0;//标记超出范围的数
continue;
}
b[i]=1;
}
for(int i=1;i<=n;i++){
if(b[i]==0){
continue;
}
if(b[i]==1){
if(a[i]>=l){
ans++;
}
if(a[i]<l){
int sum=a[i];
for(int j=i+1;j<=n;j++){//依次相加判断
if(b[j]==0){
break;
}
if(b[j]==1){
sum+=a[j];
if(sum>=l&&sum<=r){
ans++;
for(int l=i+1;l<=j;l++){
b[l]=0;//取过的牌标记防止再用
}
break;
}
if(sum>r){
break;
}
if(sum<l){
continue;
}
}
}
}
}
}
cout<<ans<<"\n";
}
return 0;
}
- 1
信息
- ID
- 1206
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 167
- 已通过
- 20
- 上传者