AcWing 刷题1

AcWing 789.数的范围

思路:

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

题解:
#include<bits/stdc++.h>
using namespace std;

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

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

AcWing 790.数的三次方根

思路:

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

题解:
#include<bits/stdc++.h>
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<n)
			l=m;
		else r=m;
	}
	cout<<fixed<<setprecision(6)<<m<<endl;
	return 0;
}

AcWing 730.机器人跳跃问题

思路:

找到公式之后倒推即可

题解:
#include<bits/stdc++.h>
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<f[i])
		e+=(f[i]-e)/2;
		else e-=(e-f[i])/2;
	int a=(int)e/1;
	if(a!=e) cout<<a+1<<endl;
	else cout<<a<<endl;
	return 0;
}

AcWing 1221.四平方和

思路:

先枚举c^2 + d^2,存入数组(相当于哈希表)

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

题解:
#include<bits/stdc++.h>
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<<a<<' '<<b<<' '<<c<<' '<<d<<endl;
				return 0;
			}
		}
	return 0;
}
posted @ 2022-01-25 16:21  longwind7  阅读(45)  评论(0编辑  收藏  举报