Cut The Wire
题目
有从1开始无限长的点.每个点被线链接,保证
i是偶数,i和i/2链接
i是奇数,i和3*i+1链接
给出n,求a链接b的线段数,保证 所有a<=n,所有b>n
思路
- 根据连接规则,显然分奇偶讨论
对于偶数x,只有 n-n/2 条线满足
对于奇数x,发现n每向右移动3位,满足要求的最左边点左移一位,所以可得到左边界,找出这个区间里的所有奇数就可以
AC代码
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
#define endl '\n'
//#define int long long
using namespace std;
typedef pair<int,int> PII;
const int N =10 + 1e5 ,mod=1e9 + 7;
int n;
void solve()
{
cin>>n;
if(n==1)
{
cout<<2<<endl;
return;
}
ll res = n/2 + n%2;
// 1->2 1->4 n=1
int l = n/3 +(n%3!=0);// 左边界
//[l,n]
if((n-l+1)%2 == 0 ) res += (n-l+1)/2; // 区间长为偶数
else if(n&1) res += (n-l+1)/2 + 1; // 区间长为奇数且奇数多
else if(n%2==0) res +=(n-l+1)/2;// 区间长为奇数且偶数多
cout << res<<endl;
}
signed main()
{
ios::sync_with_stdio();cin.tie();cout.tie();
int T;cin>>T;
int T1=clock();
while(T--)
solve();
int T2=clock();
//cerr<<endl<<" Time : "<< T2-T1 <<"ms."<<endl;
return 0;
}