算法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;
}
相关推荐
aaaameliaaa3 小时前
字符函数和字符串函数
c语言·笔记·算法
城管不管4 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
月疯4 小时前
二分法算法(水平等分图形面积)
算法
豆瓣鸡5 小时前
算法日记 - Day3
java·开发语言·算法
白白白小纯5 小时前
算法篇—反转链表
c语言·数据结构·算法·leetcode
Achou.Wang5 小时前
深入理解go语言-第5章 并发编程——Go的灵魂
大数据·算法·golang
The Chosen One9855 小时前
高进度算法模板速记(待完善)
java·前端·算法
小王C语言5 小时前
【7. 实现登录注册模块】:实现会话管理、注册/登录/退出 API
网络·c++
土豆.exe8 小时前
Fastjson2 2.0.53 哈希碰撞 RCE:从原理到三种打法
算法·哈希算法
黄河123长江8 小时前
有限Abel群的结构()
算法