A:
统计将所有偶数一直除二变成奇数的次数总和
即每个数二进制下最后一个1后面零的个数的总和
可以简单计算
while(arr[i] % 2 == 0){
ans++;
arr[i] /= 2;
}
也可以使用函数
ans+=__builtin_ctz(a);
#include<iostream>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
while(n--){
int a;
cin>>a;
ans+=__builtin_ctz(a);
}
cout<<ans;
return 0;
}
B:
求f的最大值,即每个数都取最大值,即每个数-1的和
#include<bits/stdc++.h>
using namespace std;
const int N=3e3+10;
int a[N];
int main(){
int n,ans=0;
cin>>n;
for(long long i=1;i<=n;i++)
cin>>a[i],ans+=a[i]-1;
cout<<ans;
return 0;
}
C:
除了最小值以外所有数(n-1)每次变化除一个用来当最小值的数(k-1),再加上余数的一次(或者刚好就不用加)
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int main(){
int n,k,ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ans=(n-1)/(k-1)+((n-1)%(k-1)!=0);
cout<<ans;
return 0;
}