45分求助(C++)
  • 板块P1120 小木棍
  • 楼主peter0710
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/11/11 20:38
  • 上次更新2023/10/27 03:22:05
查看原帖
45分求助(C++)
631811
peter0710楼主2022/11/11 20:38

求助

#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/11/11 20:38
加载中...