警示后人
查看原帖
警示后人
931664
sieve楼主2024/5/6 13:04

位运算比任何运算都要快!

  • 根据上面的东西,可以用二进制枚举来做。

这种代码会超时

#include<bits/stdc++.h>
using namespace std;
int n;
bool check(int x)
{
	int ans=0;
	for(int i=1;i<=5*5;++i)
	{
		if(x%2==1)
		{
			ans++;
		}
		x/=2;
	}
	return ans == n;
}
int a[35][35];
bool move(int x,int y,int dx,int dy)
{
	for(int i=1;i<=5;++i)
	{
		if(a[x][y]==0)
		{
			return false;
		}
		x+=dx;
		y+=dy;
	}
	return true;
}
int ask(int x)
{
	for(int i=1;i<=5;++i)
	{
		for(int j=1;j<=5;++j)
		{
			if(x%2>0)
			{
				a[i][j]=1;
			}
			else
			{
				a[i][j]=0;
			}
			x/=2;
		}
	}
	int ans=0;
	for(int i=1;i<=5;++i)
	{
		ans+=move(i,1,0,1);
		ans+=move(1,i,1,0);
	}
	ans+=move(1,1,1,1);
	ans+=move(1,5,1,-1);
	return ans;
}
bool vis[105];
int main()
{
	cin>>n;
	for(int i=1;i<(1<<25);++i)
	{
		if(check(i)==false)
		{
			continue;
		}
		vis[ask(i)]=true;
	}
	int ans=0;
	for(int i=1;i<=12;++i)
	{
		if(vis[i]==true)
		{
			ans+=i;
		}
	}
	cout<<ans;
	return 0;
}
  • 但是把取 modmod 和除法换成位运算:
#include<bits/stdc++.h>
using namespace std;
int n;
bool check(int x)
{
	int ans=0;
	for(int i=1;i<=5*5;++i)
	{
		if(x&1==1)
		{
			ans++;
		}
		x>>=1;
	}
	return ans == n;
}
int a[35][35];
bool move(int x,int y,int dx,int dy)
{
	for(int i=1;i<=5;++i)
	{
		if(a[x][y]==0)
		{
			return false;
		}
		x+=dx;
		y+=dy;
	}
	return true;
}
int ask(int x)
{
	for(int i=1;i<=5;++i)
	{
		for(int j=1;j<=5;++j)
		{
			if(x&1>0)
			{
				a[i][j]=1;
			}
			else
			{
				a[i][j]=0;
			}
			x>>=1;
		}
	}
	int ans=0;
	for(int i=1;i<=5;++i)
	{
		ans+=move(i,1,0,1);
		ans+=move(1,i,1,0);
	}
	ans+=move(1,1,1,1);
	ans+=move(1,5,1,-1);
	return ans;
}
bool vis[105];
int main()
{
	cin>>n;
	for(int i=1;i<(1<<25);++i)
	{
		if(check(i)==false)
		{
			continue;
		}
		vis[ask(i)]=true;
	}
	int ans=0;
	for(int i=1;i<=12;++i)
	{
		if(vis[i]==true)
		{
			ans+=i;
		}
	}
	cout<<ans;
	return 0;
}

一下就能过!

2024/5/6 13:04
加载中...