分治算法(c++)

概念

题目练习

区间合并

(归并排序应用)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
	int x,y;
	node(){};
	node(int xx,int yy)
	{
		x = xx;
		y = yy;
	}
};
node a[50010];
int n;

void guibin(int,int);

int main()
{
	
	cin>>n;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y;
	}
	guibin(1,n);
//	for(int i = 1;i<=n;i++)
//	{
//		cout<<a[i].x<<" "<<a[i].y<<endl;
//	}
	bool f = true;
	for(int i = 1;i<n;i++)
	{
		if(a[i].y<a[i+1].x)
		{
			f = false;
			break;
		}
	}
	if(f==true) cout<<a[1].x<<" "<<a[n].y;
	else cout<<"no";
	
	return 0;
}
void guibin(int l,int r)
{
	if(l==r) return;
	int mid = (l+r)/2;
	guibin(l,mid);
	guibin(mid+1,r);
	int i = l;
	int j = mid+1;
	node t[50010];
	int lt = 0;
	while(i<=mid&&j<=r)
	{
		if(a[i].x<=a[j].x)
		{
			t[++lt] = {a[i].x,a[i].y};
			i++;
		}
		else
		{
			t[++lt] = {a[j].x,a[j].y};
			j++;
		}
	}
	while(i<=mid) t[++lt] = {a[i].x,a[i].y},i++;
	while(j<=r) t[++lt] = {a[j].x,a[j].y},j++;
//	cout<<l<<" "<<r<<endl;
	for(i = 1;i<=lt;i++)
	{
//		cout<<t[i].x<<" "<<t[i].y<<endl;
		a[i+l-1] = {t[i].x,t[i].y};
	}
//	cout<<endl;
//	for(int i = 1;i<=n;i++)
//	{
//		cout<<a[i].x<<" "<<a[i].y<<endl;
//	}
//	cout<<endl<<endl;
	return;
}

寻找第K大元素

(快速排序应用)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,k,a[100010];

void kuaisu(int,int);
int main()
{
	
	cin>>n>>k;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i];
	}
	k = n-k+1;
	kuaisu(1,n);
	
	return 0;
}
void kuaisu(int l,int r)
{
	int mid = (l+r)/2;
	int res = a[mid];
	int i = l;
	int j = r;
	int zhong = i;
	while(i<=j)
	{
		while(a[i]<res) i++;
		while(a[j]>res) j--;
		if(i<=j)
		{
			swap(a[i],a[j]);
			zhong = i;
			i++;
			j--;
		}
		else break;
	}
//	cout<<l<<" "<<mid<<" "<<r<<" "<<i<<" "<<j<<" "<<zhong<<endl;
//	for(int i = 1;i<=n;i++)
//	{
//		cout<<a[i]<<" ";
//	}
//	cout<<endl;
//	system("pause");
	if(zhong==k) cout<<a[k];
	else if(zhong<k) kuaisu(zhong+1,r);
	else if(zhong>k) kuaisu(l,zhong);
	return;
}

月度开销

(分治算法)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,m,a[100010];
int sum,ma;

int main()
{
	
	cin>>n>>m;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i];
		sum += a[i];
		ma = max(ma,a[i]);
	}
	
	int l = ma,r = sum;
	int mid;
	while(l<=r)
	{
		mid = (l+r)/2;
		int t = 0;
		int sumt = 0;
		for(int i = 1;i<=n;i++)
		{
			if(a[i]+sumt<=mid) sumt += a[i];
			else t++,sumt = a[i];
		}
		if(t<m) r = mid-1;
		else if(t>=m) l = mid+1;
	}
	cout<<mid;
	
	return 0;
}
相关推荐
木井巳2 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊2 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥2 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
_Twink1e2 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
shehuiyuelaiyuehao2 小时前
算法34,位运算符操作,总结
算法
Navigator_Z2 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
dong_junshuai3 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
Navigator_Z3 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode
FOORIR3 小时前
3D视觉+AI客流系统怎么做:从Sensor Pipeline到数据事件引擎
算法
雪的季节4 小时前
Multisim14.0的详细中文安装步骤【附安装包】
c++