45分求助c++
  • 板块P1120 小木棍
  • 楼主peter0710
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/12/3 10:22
  • 上次更新2023/10/27 00:40:22
查看原帖
45分求助c++
631811
peter0710楼主2022/12/3 10:22

求助

#include <iostream>
#include <cstring>

using namespace std;

double n,sum;
int factorization[100] = {0};
int a[100] = {0};
int b[100] = {0};
int ans = 0;
int index1 = 0;
int tmp1 = -1;
bool flag = false;
int temp = 0;
int testfact(int dat);
int findnear(int dat,int num);

int Factorization(int num)
{
    index1 = 0;
    for(int i=2;i<=num;i++){
        if(num % i == 0){
            factorization[index1] = i;
            index1++;
        }
    }
    return 0;
} 

int sort(int arr[],int len) 
{
    for(int i=len-1;i>0;i--){
        for(int j=0;j<len-1;j++){
            if(arr[j] < arr[j+1]){
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
    return 0;
}
int main()
{
    //1.输入数据 
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    //2.木棍总长 
    for(int i=0;i<n;i++){//9 5 2 1 5 2 1 5 2 1
        sum += a[i];
    }
    //3.因式分解 
    Factorization(sum);
    //4.小木棍排序 
    sort(a,n);
    //5.开始试验
    for(int i = 0;i<index1;i++){
        if(testfact(factorization[i])==1){
            cout<<factorization[i];
            return 0;
        }
    }   
    return 0;
}
int testfact(int dat){
    int tmp,neardat,target;
    tmp = n;
    target = dat;
    //把a复制到b里
    for(int i=0;i<n;i++) 
        b[i]=a[i];
    while(tmp>0) {
         neardat=findnear(target,tmp);
         if(neardat == -1){ //无法拼凑了,就说明这个数不行,返回0 
            return 0;
         }
         else if(neardat==target){  //一根根子拼完了,拼下一根 
            target = dat;
            tmp--; 
         }
         else{
            target = target - neardat;
            tmp--;
         }      
    }
    return 1; //所有的棍子都用完了 
}

//二分法找最接近的数 
int findnear(int dat,int num){
    int low,high,tmp,mid;       
    low = 0;
    high = num-1;
    if(b[high]>dat) //如果最小的数都比dat大,就没法比下去了 
        return -1;
    while(low < high){
        mid = (high + low) / 2;
        if(b[mid] > dat && b[mid+1]<=dat){
            high = mid+1;
            break;
        }
        else if(b[mid] > dat ){
            low= mid;
        }
        else{
            high = mid;
        }
    }
    if(b[high] <= dat){
        tmp = b[high];
        b[high] = 0;
        sort(b,num);
        return tmp;
    }
    else
        return -1;

}
2022/12/3 10:22
加载中...