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;
}