分治算法(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;
}
相关推荐
To_OC7 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495647 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr8 小时前
2607C++,soui与安卓
c++·soui
fqbqrr11 小时前
2607C++,使用微软detours勾挂工具
c++
爱刷碗的苏泓舒11 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
蓝悦无人机14 小时前
C++基础 — 函数总结
开发语言·c++
烬羽14 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米14 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠15 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua