算法基础(二)

26 篇文章 0 订阅

本节是关于二分查找的学习

蒜头君手上有个长度为 nn 的数组 AA。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 xx 是否在数组 AA 中。

输入格式

第一行输入两个整数 nn 和 mm,分别表示数组的长度和查询的次数。

接下来一行有 nn 个整数 a_iai​。

接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。

输出格式

对于每次查询,如果可以找到,输出"YES",否则输出"NO"

数据范围

1 \le n, m \le 10^5, 0 \le x \le 10^61≤n,m≤105,0≤x≤106。

二分查找(一) - 题库 - 计蒜客 (jisuanke.com)

// binary_Search1Easily.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
const int N = 100010;
int q[N], n;

bool Binary_Search(int x)
{
    int l = 0, r = n - 1;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (x == q[mid])  return true;
        if (x > q[mid])   return l = mid + 1;
         else             r = mid - 1;
    }
    return false;

}
int main()
{
    int m;
    cin >> n >> m;
    for (int i = 0; i < n; i++)    cin >> q[i];
    while (m--)
    {
        int x;
        cin >> x;
        if (Binary_Search(x))    cout << "Yes" << endl;
        else   cout << "No" << endl;

    }

    return 0;
}


大于等于 xx 的最小值是多大?

二分查找(二) - 题库 - 计蒜客 (jisuanke.com)

int binary_search(int x)
{
	int l = 0, r = n - 1;
	while (l < r)
	{
		int mid = l + r >> 1;
		if (x <= q[mid]) r = mid;
		else l = mid + 1;
	}
	return l;
}

 小于等于x的最大值

二分查找(五) - 题库 - 计蒜客 (jisuanke.com)

int sr(int x) //小于等于x的最大值
{
	int l = 0, r = n - 1;
	while (l < r)
	{
		int mid = l + r + 1 >> 1;//取高位
		if (x >= q[mid]) l = mid;
		else r = mid - 1;
	}
	return l;
}

 


矩阵的前缀和

(理论推导一大堆,随便一搜都是。在这直接上代码)

#include<iostream>
using namespace std;

const int N = 1010;
int  q[N][N], n, m;
long long  s[N][N];
int main()
{

	int ms;
	cin >> n >> m >> ms;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			scanf("%d", &q[i][j]);
			s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + q[i][j];
		}
			


	while (ms--)
	{
		int x1, x2, y1, y2;
		scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
		printf("%lld\n", s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]);
	}

	return 0;
}

竞码编程_少儿编程培训_NOIP培训_CSP培训_蓝桥杯培训|编程教育机构 (hzjingma.com)

一维数组前缀和

#include<iostream>
using namespace std;

const int N = 100010;
int q[N], n;
int s[N];
int main()
{
	int m;
	cin >> n>>m;
	for(int i = 1 ;i<=n;i++) cin>>q[i],s[i]=s[i-1]+q[i];
	while (m--)
	{
		int l, r;
		cin >> l >> r;
		cout << s[r] - s[l - 1] << endl;
	}
	return 0;
}

竞码编程_少儿编程培训_NOIP培训_CSP培训_蓝桥杯培训|编程教育机构 (hzjingma.com)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值