分治算法(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;
}
相关推荐
jimy18 分钟前
c++的 Type Traits (二、更详细版本)
开发语言·c++
碧海银沙音频科技研究院18 分钟前
基于炬芯ATS3089X自研AEC声学回声消除算法
算法
通问AI38 分钟前
在两台 Mac Studio 上跑 800B 模型:MLX + RDMA over Thunderbolt 实测与四道门选型法
算法
ZywOo62339 分钟前
《算法竞赛进阶指南》0x03 前缀和与差分
算法
Scintilla_y1 小时前
DAY2 滑动窗口
算法·leetcode·散列表
lvwangshu1 小时前
笛卡尔树
算法·图论
026d231 小时前
状态信号只知“其然”不知“其所以然”:变工况机械故障诊断的物理盲区
算法
姜鱼问生1 小时前
备份和服务器在同一台机器上,等于没备份
算法·架构
姜鱼问生2 小时前
别再 chmod 777 了,用 ACL 给它开一扇窗
后端·算法·架构
特立独行的猫a2 小时前
仓颉语言UI开发实战:我用仓颉写了个桌面版力扣
算法·leetcode·ui·tauri·仓颉·cj-tarui