AcWing 刷题1


AcWing 789.数的范围

思路:

整数二分,用二分模板做,先找右侧区间的左端点,再找左侧区间的右端点

题解:
#include
using namespace std;

const int N=100010;
int f[N];
int n,q,x;

int main()
{
	cin>>n>>q;
	for(int i=0;i>f[i];
	while(q--)
	{
		cin>>x;
		int l=0,r=n-1;
		while(l=x)
				r=mid;
			else l=mid+1;
		}
		if(f[l]==x) cout<

AcWing 790.数的三次方根

思路:

实数二分,不需要考虑太多

题解:
#include
using namespace std;

int main()
{
	double n;
	cin>>n;
	double l=-100.0;
	double r=100.0;
	double m;
	while(r-l>10e-8)
	{
		m=(l+r)/2;
		if(m*m*m

AcWing 730.机器人跳跃问题

思路:

找到公式之后倒推即可

题解:
#include
using namespace std;

const int N=100005;
int f[N];
int n;
double e=0;

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>f[i];
	for(int i=n;i>=1;i--)
		if(e

AcWing 1221.四平方和

思路:

先枚举c2+d2,存入数组(相当于哈希表)

再枚举a2+b2,注意按照字典序枚举,然后检查数组中下标为[n-a2-b2]是否有值,如果有,则此时的a b c d即为字典序最小的答案。

题解:
#include
using namespace std;

const int N=5000005;
int f[N],sta[N];
int n;

int main()
{
	cin>>n;
	for(int a=0;a*a<=n;a++)
		for(int b=a;a*a+b*b<=n;b++)
		{
			if(sta[a*a+b*b]==0)
			{
				f[a*a+b*b]=a;
				sta[a*a+b*b]=1;
			}
		}
	for(int a=0;a*a<=n;a++)
		for(int b=a;a*a+b*b<=n;b++)
		{
			if(sta[n-a*a-b*b]==1)
			{
				int c,d;
				c=f[n-a*a-b*b];
				d=sqrt(n-a*a-b*b-c*c);
				cout<