算法C++

枚举

1.化段为点

前缀和 eg:给一个数列,算x到y个数的和

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int n;
	cin>>n;
	vector<int> a(n);
	vector<int> sum(n+1,0);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		sum[i+1]=sum[i]+a[i];
	}
	int x,y;
	cin>>x>>y;
	cout<<sum[y]-sum[x-1];
 }

给一段数字,q次访问,每次对[x,y]区间进行加减x,最后再重新给出新的一段数字

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int n;
	cin>>n;
	vector<int> a(n+1,0);
	vector<int> cha(n+1,0);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		cha[i-1]=a[i]-a[i-1]; 
	}
	int q;
	cin>>q;
	for(int i=0;i<q;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		cha[x-1]+=z;
		cha[y]-=z;
	}
	for(int i=1;i<=n;i++)
	{
		a[i]=a[i-1]+cha[i-1];
		cout<<a[i]<<endl;
	}
}

n棵树,q次砍树区间为[x,y],求之后树总数量

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct sb
{
	int pos,num;
};

bool compare(sb x,sb y)
{
	if(x.pos == y.pos )
	{
		return x.num < y.num ;
	}
	return x.pos < y.pos ;
}

int main()
{
	int n,q;
	cin>>n>>q;
	vector<sb> a(q*2);
	for(int i=0;i<q;i++)
	{
		int x,y;
		cin>>x>>y;
		if(x>y)
		{
			int t=x;
			x=y;
			y=t;
		}
		a[i].pos=x-1;
		a[i].num=1;
		a[i+q].pos=y;
		a[i+q].num=-1;
	}
	sort(a.begin() , a.end() ,compare);
	int cnt=a[0].pos;
	int b=0;
	for(int i=0;i<q*2;i++)
	{
		b=b+a[i].num;
		if(b==1&&a[i].num==1&&i>0)
		{
			cnt+=a[i].pos-a[i-1].pos;
		}
	}
	cnt+=n-a[2*q-1].pos;
	cout<<cnt+1;
 } 

输入n个数,有m区间可以缓存,求需要存多少

cpp 复制代码
#include<iostream>

using namespace std;

int main()
{
	int n,m,cnt=0;
	cin>>n>>m;
	int v[n],a[n];
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		if(v[x]==1)
		{
			continue;
		}
		a[cnt++]=x;
		v[x]=1;
		if(cnt>m)
		{
			v[a[cnt-m-1]]==0;
		}
	}
	cout<<cnt;
}

追逐法/双指针法/尺量法/蚯蚓法:一缩一进

cpp 复制代码
#include<iostream>
#include <algorithm>
using namespace std;

int main()
{
	int n,s;
	cin>>n>>s;
	int a[n];
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	int len=n+1,r=0;
	int sum=0;
	for(int l=0;l<n;l++)
	{
		while(r<n&&sum<s)
		{
			sum+=a[r];
			r++;
		}
		if(sum>=s)
		{
			len=min(r-l,len);
		}
		else
		{
			break;
		}
		sum-=a[l];
	}
	if(len>n)
	{
		printf("0");
	}
	else
	{
		printf("%d",len);
	}
	return 0;
}
相关推荐
算AI11 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程55511 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
懒羊羊大王&12 小时前
模版进阶(沉淀中)
c++
owde12 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
第404块砖头12 小时前
分享宝藏之List转Markdown
数据结构·list
GalaxyPokemon12 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
W_chuanqi12 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
hyshhhh12 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
蒙奇D索大13 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西13 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea