1.

 能拆分(k>0)就把n二等分,不能拆分就返回n,递归就行了

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int chai(int n,int k){
	if(n==1)
		return 1;
	if(k==0)
		return n;
	if(n%2==1)
		return chai(n/2+1,k-1)+1;
	else
		return chai(n/2,k-1)+1; 
}
int main(){
	int n,k;
	scanf("%d %d",&n,&k);
	int res=chai(n,k);
	printf("%d\n",res); 
	return 0;
}

2.

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int f[300005];
int main(){
    int n;
	long long cost=0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>f[i];
    }
    for(int i=0;i<n-1;i++)
        f[i+1]+=f[i];
    for(int i=0;i<n;i++)
        cost+=abs(f[i]);
    cout<<cost<<endl;
    return 0;
}

3.

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int arr[100005];
int main(){
    int n, k;
    cin>>n>>k;
    for(int i=0;i<n;i++)
        cin>>arr[i];
    sort(arr, arr+n);
    int cnt = 1;
    cout<<arr[0]<<endl;
    for(int i=1;i<n;i++){
        if(cnt==k){
            break;
        }
        if(arr[i]!=arr[i-1]){
            cout<<arr[i]-arr[i-1]<<endl;
            cnt++;
        }
    }
    while(cnt++<k)
        cout<<0<<endl;
    return 0;
}