加快程序速度的技巧

1.For循环:
 

for(int i=1;i<=n;i++)

慢于

for(int i=1;i<=n;++i)

2.读入输出

cin慢于scanf慢于ios::sync_with_stdio(false)+cin慢于基于getchar的快读

快读快写代码:

​int read()
{
	int s=0,t=1;
	char ch;
	ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') t=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		s=(s<<1)+(s<<3)+ch^48;
		ch=getchar();
	}
	return t*s;
}
void write(int x)
{
	if(x==0) return;
	write(x/10);
	putchar((x%10)+'0');
}

3.运算

优先使用位运算:& | ^ << >>

速度更快。

附位运算基本操作:

取二进制数n的第k位(从右到左) n&(1<<(k-1))
截取二进制数n第k位后m位(从左到右) n&((1<
求二进制数n最后一个“1”对应的数值,即lowbit函数 n&(-n)
将二进制数n的第k位设为“1” n|=(1<<(k-1))
将二进制数n的第k位设为“0” n&=~(1<<(k-1))

4.优化算法

如动态规划->四边行不等式/斜率/单调队列/高级数据结构/ 优化

如,合并石子问题使用单调队列优化:

可以将时间复杂度降至O(n^2)

未优化代码:O(n^3)

#include
using namespace std;
int n,d[110][110],temp[10010],a[110];
int main()
{
	cin>>n;
	memset(d,63,sizeof(d));
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		d[i][i]=0;
		temp[i]=temp[i-1]+a[i];
	}
	for(int i=n-1;i>=1;i--)
	{
		for(int j=i+1;j<=n;j++)
		{
			for(int k=i;k

 优化后代码:

#include
using namespace std;
int n,sum=0,ans;
vector v;
int main()
{
	scanf("%d",&n);
	v.push_back(2147483640);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		v.push_back(x);
	}
	v.push_back(2147483640);
	while(n-->1)
	{
		int k,j;
		for(k=1;k<=n;k++) if(v[k-1]=0;j--) if(v[j]>sum) break;
		v.erase(v.begin()+k-1);
		v.erase(v.begin()+k-1);
		v.insert(v.begin()+j+1,sum);
		ans+=sum;
	}
	cout<

5.手动火车头(O1,O2,O3)

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")

你可能感兴趣的:(算法,数据结构)