(仅做为个人笔记,反思)
题目意思:开始在原点,返回到达x位置的操作数
操作:1.在第k轮时走到+k位置(y+k)
2.走-1位置(y-1)
思路:先一直选择操作1,直到y>=x。1.若等于,返回步数;2.若不等于,说明刚刚走的那么多步中有一步换成操作2即可,因为之前走的所有步长中肯定会出现y-x+1,把那一步换成-1即可。若没有,就说明只要走-1步就行,ans++;
code:
#include<iostream>
using namespace std;
const int N=2e3+7;
int p[N];
void init()
{
for(int i=1;i<N;i++)p[i]=p[i-1]+i;
}
int find(int x)
{
int l=0,r=N-1;
int mid;
while(l<=r)
{
mid=(l+r)/2;
if(x==p[mid])return mid;
else if(x<p[mid])r=mid-1;
else l=mid+1;
}
return l;
}
int main()
{
init();
int t,x;
cin>>t;
while(t--)
{
cin>>x;
int ans=find(x);
if(p[ans]-1==x)ans++;
cout<<ans<<endl;
}
}
date:23.2.26
标签:int,HZNUFeb1,Jumps,mid,while,ans,cf1455b From: https://www.cnblogs.com/afengdabaobei/p/17156320.html