分治算法(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 小时前
C++多线程教程-1.2.1 C++11/14/17 并发特性迭代
开发语言·c++
睡一觉就好了。2 小时前
快速排序——霍尔排序,前后指针排序,非递归排序
数据结构·算法·排序算法
80530单词突击赢2 小时前
C++入门指南:从零到精通
开发语言·c++
Tansmjs3 小时前
C++编译期数据结构
开发语言·c++·算法
金枪不摆鳍3 小时前
算法-字典树
开发语言·算法
diediedei3 小时前
C++类型推导(auto/decltype)
开发语言·c++·算法
兩尛3 小时前
c++的数组和Java数组的不同
java·开发语言·c++
lhxcc_fly3 小时前
手撕简易版的vector
c++·vector
独断万古他化3 小时前
【算法通关】前缀和:从一维到二维、从和到积,核心思路与解题模板
算法·前缀和