T1839.特殊的集合(贪心)

看到群里的大佬在刷这题,就把这题刷一下,不然一天都在摸鱼~

思路:贪心。

考虑:每次都取后一半,然后就是相当于一个递归的过程。

比如: n = 100 n=100 n=100。

1 : [ 51 , 100 ] → [ 13 , 25 ] → [ 4 , 6 ] → [ 1 , 1 ] 1:[51,100]\rightarrow [13,25]\rightarrow [4,6]\rightarrow [1,1] 1:[51,100]→[13,25]→[4,6]→[1,1]。

时间复杂度: O ( l o g n ) O(logn) O(logn)

#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int ans=0;
while(n){
int m=n/2+1;
ans+=n-m+1;
n=m/2;
if(n*2==m) n--;
}
printf("%d\n",ans);
}