1 快排 (6.7

取消同步流

  1. 注意输出格式最后一个到底有没有空格 格式可能导致错误
    快排
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	for (int i = 0;i < n;i++)
		cin >> a[i];
	sort(a,a+n);
	for (int i = 0;i < n;i++)
	{
		if (i != n - 1)
			cout << a[i] << " ";
		else
			cout << a[i];
	}
		
}

2 第k小的数 (6.7

nth_element(开始迭代器, 目标位置迭代器, 结束迭代器);

  1. 记得取消同步流
  2. vector才有.begin() .end()这种用法 数组应该是a,a+k,a+n a+1,a+1+k,a+1+n.
  3. !!! 返回类型是 void(空),它的作用是直接修改你的数组,把第 $k$ 小的那个数搬运到你指定的那个位置上去。直接去数组里读 a[k],那就是你要找的第 $k$ 小的数。 相当于保证比这个小,一边比这个大
  4. i得从0开始,因为有第0小。否则会下标错乱
    https://www.luogu.com.cn/problem/P1923
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 5e6 + 10;
int a[maxn];
signed main()
{
	//1 取消同步流
	//2 nth_element
	//3 return 0;
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int n, k;
	cin >> n >> k;
	for (int i = 0;i < n;i++)cin >> a[i];
	nth_element(a, a + k, a + n);
	cout << a[k] << endl;
	return 0;
}

3 整数因子分解 (6.7

  1. map<int,int>mp;不然数组太大,注意是键值对,两个int。取数用mp[i]
  2. if (i * i != x) 第二个if需要嵌套在第一个里面,注意嵌套关系
  3. 需要longlong并且搭配signed main 且必须返回0
  4. sqrt能取等,比如4=2*2
  5. mp[x] = 1;不能放在for循环里因为比如2进不去for
  6. 因子i是从2开始
  7. 函数返回值

https://oj.sdutacm.cn/onlinejudge3/contests/4285/problems/B

点击查看代码
#include<bits/stdc++.h>
#define int long long
//需要开longlong
using namespace std;
map<int, int> mp;
int solve(int n)
{
	if (n == 1)return 1;
	else if (mp.count(n) != 0)return mp[n];
	else
	{
		mp[n] = 1;
		//应该是<=,比如4=2*2;
		for (int i = 2;i <=sqrt(n);i++)
		{
			if (n % i == 0)
			{
				mp[n] += solve(i);
				//第二个if应该嵌套在第一个里面
				if (i * i != n)
				{
					mp[n] += solve(n / i);
				}
			}
			
		}

	}
	return mp[n];

}
signed main()
{
	int n;
	cin >> n;
	cout << solve(n);
	return 0;
}

4 折半查找

https://www.luogu.com.cn/problem/P2249

1)查找

点击查看代码
#include<bits/stdc++.h>
const int maxn = 1e6 + 10;
int a[maxn], b[maxn];
using namespace std;
signed main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0;i < n;i++)cin >> a[i];
	for (int i = 0;i < m;i++)cin >> b[i];
	for (int i = 0;i < m;i++)
	{
		//vector才是a.begin(),a.end()
		int k = lower_bound(a, a+n, b[i]) - a;
		if (a[k] != b[i])
		{
			cout << "-1" << " ";
			continue;

		}
		else{
			cout << k+1 << " ";
			
		}

	}
}

2) 二分

模板
点击查看代码
向左找
int bin1(int l,int r)
{
    while(l<r)
    {
        
        int mid=(l+r)>>1;
    if(check(mid)) r=mid;
        else l=mid+1;
       
    }
    
     return l;
}
向右找
int bin2(int l,int r)
{
    while(l<r)
    {
        
        int mid=(l+r+1)>>1;
		//注意这里+1
        if(check(mid))
            l=mid;
        else
            r=mid-1;
    }
    return l;
    
}

https://www.luogu.com.cn/problem/P2249

点击查看代码
#include<bits/stdc++.h>
const int maxn = 1e6 + 10;
int a[maxn], b[maxn];
using namespace std;
int bl1(int l, int r,int x)
{

	while (l < r)
	{
		int mid = (l + r) / 2;
		if (a[mid]>=x) r = mid;
		else l = mid + 1;

	}
	return l;
}
int bl2(int l, int r,int x)
{

	while (l < r)
	{
		int mid = (l + r+1) / 2;
		//右边界mid需要加1
		if (a[mid]<=x) l = mid;
		else r = mid -1;

	}
	return l;
}
signed main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0;i < n;i++)cin >> a[i];
	for (int i = 0;i < m;i++)cin >> b[i];
	for (int i = 0;i < m;i++)
	{
		int x1 = bl1(0, n, b[i]);
		if (a[x1] == b[i])
			cout << x1+1<< " ";
		else
			cout << -1 << " ";
	}
}
posted on 2025-12-05 16:49  Hoshino1  阅读(3)  评论(0)    收藏  举报