1 快排 (6.7
取消同步流
- 注意输出格式最后一个到底有没有空格 格式可能导致错误
快排
点击查看代码
#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(开始迭代器, 目标位置迭代器, 结束迭代器);
- 记得取消同步流
- vector才有.begin() .end()这种用法 数组应该是a,a+k,a+n a+1,a+1+k,a+1+n.
- !!! 返回类型是 void(空),它的作用是直接修改你的数组,把第 $k$ 小的那个数搬运到你指定的那个位置上去。直接去数组里读 a[k],那就是你要找的第 $k$ 小的数。 相当于保证比这个小,一边比这个大
- 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
- map<int,int>mp;不然数组太大,注意是键值对,两个int。取数用mp[i]
- if (i * i != x) 第二个if需要嵌套在第一个里面,注意嵌套关系
- 需要longlong并且搭配signed main 且必须返回0
- sqrt能取等,比如4=2*2
- mp[x] = 1;不能放在for循环里因为比如2进不去for
- 因子i是从2开始
- 函数返回值
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 << " ";
}
}
浙公网安备 33010602011771号