第一行四个正整数n,k,a,b。
第二行n个通过空格隔开的正整数表示一排n个同学的能力值。
第二行n个通过空格隔开的正整数表示一排n个同学的合作值。
n <= 80000,
保证k<=n且x,y,a,b<=100000。
输出一个非负整数表示选人方案数。
10 2 2 4 2 2 9 1 8 1 6 1 7 7 4 8 5 1 9 4 1 3 9 4
3
有选择第1,2两个人,第2,3两个人,第9,10两个人三种方案。
import sys # 读取第一行输入数据:n, k, a, b g_data = list(map(int, sys.stdin.readline().split())) n = g_data[0] # 学生总数 k = g_data[1] # 需要选择的连续学生数 a = g_data[2] # 能力值下限 b = g_data[3] # 合作值下限 # 读取能力值数组和合作值数组 nums1 = list(map(int, sys.stdin.readline().split())) # 能力值 nums2 = list(map(int, sys.stdin.readline().split())) # 合作值 count = 0 # 记录当前连续满足条件的学生数 ans = 0 # 记录总方案数 # 遍历每个学生 for i in range(n): # 如果当前学生同时满足能力值和合作值要求,连续计数+1 if nums1[i] >= a and nums2[i] >= b: count += 1 else: # 不满足条件则重置连续计数 count = 0 # 当连续满足条件的学生数达到k时,方案数+1,同时连续计数-1(为了处理重叠窗口) if count == k: ans += 1 count -= 1 # 输出结果 print(ans)这题很好做
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
int a = in.nextInt();
int b = in.nextInt();
int[] arrX = new int[n];
int[] arrY = new int[n];
for (int i = 0; i < n; i++) {
arrX[i] = in.nextInt();
}
for (int i = 0; i < n; i++) {
arrY[i] = in.nextInt();
}
int left = 0;
int right = k - 1;
int countK = 0;
int count = 0;
for (int i = left; i <= right; i++) {
if (arrX[i] >= a && arrY[i] >= b) {
countK++;
}
}
if (countK == k) count++;
left++;
right++;
while (right < n) {
if (arrX[left - 1] >= a && arrY[left - 1] >= b) {
countK--;
}
if (arrX[right] >= a && arrY[right] >= b) {
countK++;
}
if (countK == k) count++;
left++;
right++;
}
System.out.println(count);
}
} import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
int start = -1;
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n = in.nextInt(), k = in.nextInt(), a = in.nextInt(), b=in.nextInt();
int[] aArr = new int[n]; int[] bArr = new int[n];
int cnt = 0;
for (int i = 0; i < n; i++) {
aArr[i] = in.nextInt();
}
for (int i = 0; i < n; i++) {
bArr[i] = in.nextInt();
}
for (int i = 0; i < n; i++) {
if(aArr[i] >= a && bArr[i] >= b){
if(start == -1){
start = i;
//System.out.println("start:"+start);
}
}else{
if(start != -1){
int end = i - 1;
//System.out.println("end:"+end);
if((end - start + 1) >= k){
cnt += (end - start + 1) - k + 1;
}
start = -1;
}
}
}
if(start != -1){
cnt += (n - 1 - start + 1) - k + 1;
}
System.out.println(cnt);
}
} 假设有区间 0 ~ 2符合,那么该区间长度为l = 3, 则有 l - k + 1个组合,将其加到cnt中,问题解决。
public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n = sc.nextInt(); int k=sc.nextInt(); int a = sc.nextInt(); int b= sc.nextInt(); int[] as=new int[n]; int[] bs=new int[n]; int sum=0; for (int i=0;i<n;i++){ as[i]=sc.nextInt(); } for (int i=0;i<n;i++){ bs[i]=sc.nextInt(); } for (int i=0;i<=n-k;i++){ int lag=0; for(int j=i;j<k+i;j++){ if (as[j]<a||bs[j]<b){ break; }else { lag++; } } if (lag==k){ sum++; } } System.out.println(sum); }
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
int a = in.nextInt();
int b = in.nextInt();
int[] arrX = new int[n];
int[] arrY = new int[n];
for (int i = 0; i < n; i++) {
arrX[i] = in.nextInt();
}
for (int i = 0; i < n; i++) {
arrY[i] = in.nextInt();
}
int count = 0;
int [] pre = new int[n+1];
for(int i=1;i<=n;i++){
if (arrX[i-1] >= a && arrY[i-1] >= b) {
pre[i]=pre[i-1]+1;
}else{
pre[i]=pre[i-1];
}
}
for(int i=k;i<=n;i++){
if(pre[i]-pre[i-k]==k){
count++;
}
}
System.out.println(count);
}
} #include <stdio.h>
#include <stdbool.h>
int main() {
int n, k, a, b;
scanf("%d %d %d %d", &n, &k, &a, &b);
int abilityValue[n];
int cooperationValue[n];
for (int i = 0; i < n; i++) {
scanf("%d", &abilityValue[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &cooperationValue[i]);
}
bool canSelect[n];
for (int i = 0; i < n; i++) {
canSelect[i] = false;
}
for (int i = 0; i < n - k + 1;) {
if (i == 0 || !canSelect[i - 1]) {
int j = i;
for (; j < i + k; j++) {
if (abilityValue[j] < a || cooperationValue[j] < b) {
i = j + 1;
break;
}
}
if (j == i + k) {
canSelect[i] = true;
i += 1;
}
} else {
int j = i + k - 1;
if (abilityValue[j] < a || cooperationValue[j] < b) {
i = j + 1;
} else {
canSelect[i] = true;
i += 1;
}
}
}
int r = 0;
for (int i = 0; i < n - k + 1; i++) {
if (canSelect[i]) {
r += 1;
}
}
printf("%d\n", r);
return 0;
} #include <iostream>
#include <numeric>
#include <vector>
#include <sys/types.h>
using namespace std;
int main() {
// int a, b;
// while (cin >> a >> b) { // 注意 while 处理多个 case
// cout << a + b << endl;
// }
int n,k;
long long a,b;cin>>n>>k>>a>>b;
vector<int> nengli_hezuo(n,1); // 1表示达标,0表示不符要求
int temp;
for(int i = 0;i<n;i++)
{
cin>>temp;
if(temp<a)nengli_hezuo[i] = 0;
}
for(int i = 0;i<n;i++)
{
cin>>temp;
if(temp<b)nengli_hezuo[i] = 0;
}
int ans = 0,sum = accumulate(nengli_hezuo.begin(),nengli_hezuo.begin()+k,0);
if(sum == k) ans++;
for(int i = k;i<n;i++)
{
sum = sum+nengli_hezuo[i] - nengli_hezuo[i-k];
if(sum == k) ans++;
}
cout<<ans;
}
// 64 位输出请用 printf("%lld")