4422. 智力测试
贪心
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int sum=0;
for(int i=1;n>0;i++)
{
n-=i*(i+1)/2;
if(n>=0)sum++;
}
cout<<sum<<endl;
return 0;
}
4423. 最近距离
将0的下标存入,二分求离每个点最近的0
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int>v;
vector<int>zero;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
v.push_back(x);
if(!x) zero.push_back(i);
}
for(int i=0;i<n;i++)
{
if(v[i]==0)cout<<0<<' ';
else
{
int l=0,r=zero.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(zero[mid]>=i)r=mid;
else l=mid+1;
}
int a=zero[l];
l=0,r=zero.size()-1;
while(l<r)
{
int mid=l+r+1>>1;
if(zero[mid]<=i)l=mid;
else r=mid-1;
}
int b=zero[l];
cout<<min(abs(a-i),abs(b-i))<<' ';
}
}
return 0;
}
4424. 等式
推导过程:
a
+
b
=
d
,
a
∗
b
=
d
a+b=d,a*b=d
a+b=d,a∗b=d推出
a
2
−
a
d
+
d
2
=
0
a^2-ad+d^2=0
a2−ad+d2=0
根据韦达定理:
d
2
−
4
d
<
0
d^2-4d<0
d2−4d<0无解。
最后 a,b根据求根公式求得
#include <bits/stdc++.h>
using namespace std;
void solve()
{
double d;
cin>>d;
double a,b;
if(d*d-4*d<0)puts("N");
else
{
cout<<"Y"<<' ';
a=(d+sqrt(d*d-4*d))/2;
b=(d-sqrt(d*d-4*d))/2;
printf("%.10f %.10f\n",a,b);
}
}
int main()
{
int _;
cin>>_;
while(_--)solve();
return 0;
}