二分与前缀和

本文深入探讨了二分查找算法及其在解决数组问题中的应用,同时讲解了前缀和的概念及其在求解数组求和问题上的高效策略。通过实例分析,帮助读者掌握这两种强大的算法工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分与前缀和

在这里插入图片描述

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int q = in.nextInt();
		int[] a = new int[n + 5];
		for (int i = 0; i < n; i ++) {
			a[i] = in.nextInt();
		}
		while (q -- > 0) {
			int x = in.nextInt();
			int l = 0, r = n - 1;
			while (l < r) {
				int mid = l + r >> 1;
				if (a[mid] >= x) r = mid;
				else l = mid + 1;
			}
			if (a[r] == x) {
				System.out.print(r);
				l = 0;
				r = n - 1;
				while (l < r) {
					int mid = l + r + 1 >> 1;
					if (a[mid] <= x) {
						l = mid;
					} else r = mid - 1;
				}
				System.out.println(" " + r);
				
			} else {
				System.out.println(-1 + " " + -1);
			}
		}
	}

}

在这里插入图片描述

import java.util.Scanner;

public class Main {
	
	static double eps = 1e-8;
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		double n = in.nextDouble();
		double l = -10000, r = 10000;
		while (r - l >= eps) {
			double mid = (l + r) / 2;
			if (mid * mid * mid >= n) r = mid;
			else l = mid;
		}
		System.out.println(String.format("%.6f", l));
	}

}

在这里插入图片描述

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int T = in.nextInt();
		int[] arr = new int[n + 5];
		int[] sum = new int[n + 5];
		for (int i = 1; i <= n; i ++) {
			arr[i] = in.nextInt();
			sum[i] = sum[i - 1] + arr[i]; // 前缀和
		}
		while(T -- > 0) {
			int l = in.nextInt();
			int r = in.nextInt();
			System.out.println(sum[r] - sum[l - 1]); // 区间和
		}
		
	}

}

在这里插入图片描述

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		int T = in.nextInt();
		int[][] arr = new int[n + 5][m + 5];
		int[][] sum = new int[n + 5][m + 5];
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= m; j ++) {
				arr[i][j] = in.nextInt();
				// 矩阵前缀和
				sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + arr[i][j]; 
			}
		}
		while(T -- > 0) {
			int x1 = in.nextInt();
			int y1 = in.nextInt();
			int x2 = in.nextInt();
			int y2 = in.nextInt();
			// 子矩阵和
			System.out.println(sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1]);
		}
		
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值