分治算法(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++常用的STL
c++·算法
weilx12343 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集