蒟蒻6pts求调,样例没过qwq
  • 板块P1120 小木棍
  • 楼主tysgk
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/26 16:47
  • 上次更新2023/10/24 03:02:00
查看原帖
蒟蒻6pts求调,样例没过qwq
798860
tysgk楼主2023/1/26 16:47
#include <bits/stdc++.h>
using namespace std ;

int n , fac , sum , rest , ans = 10e8 , need ;//小木棍的个数 有效的木棍个数 所持有的木棍总长 剩余需要的长度 存储答案 需要的木棍个数 
int a[ 100 ] ;//储存木棍长度 
int vis[ 100 ] ;//判断木棍是否被使用过 
int flag ;//判断是否找到答案 

bool cmp ( int x , int y ) {
	return x > y ;
}

void dfs ( int q , int w , int r , int t ) {
	if ( t == 0 && w == need ) {
		ans = min ( ans , rest ) ;
		flag = 1 ;
		return ;
	}//剪枝2:如果找到答案,剩下直接return掉 
	if ( flag == 1 ) return ;
	if ( t == 0 && w != need ) {
		flag = 1 ;
		return ;
	}//剪枝3:如果木棍用完了都不能拼凑出来,剩下直接return 
	for ( int k = 0 ; k < fac ; k++ ) {
		if ( a[ k ] == a[ k - 1 ] && vis[ k - 1 ] == 0 && vis[ k - 1 ] == 0 ) {
			continue ;
		}
		else if ( vis[ k ] == 0 ){
			if ( q + a[ k ] > r && vis[ k ] == 0 ) {
				continue ;
			}
			else if ( q + a[ k ] == r && vis[ k ] == 0 ) {
				vis[ k ] = 1 ;
				t-- ;
				dfs( 0 , w + 1 , rest , t ) ;
				t++ ;
				vis[ k ] = 0 ;
				if ( q == 0 || q + a[ k ] == 0 ) return ;
			}
			else if ( q + a[ k ] < r && vis[ k ] == 0 ) {
				vis[ k ] = 1 ;
				t-- ;
				dfs( q + a[ k ] , w , r - a[ k ] , t - 1 ) ;
				t++ ;
				vis[ k ] = 0 ;
				if ( q == 0 || q + a[ k ] == 0 ) return ;
			}
		}
	}
}

int main() {
	cin >> n ;
	for ( int i = 0 ; i < n ; i++ ) {
		cin >> a[ i ] ;
		if ( a[ i ] <= 50 ) {
			sum += a[ i ] ;
			fac++ ;
		}
		else a[ i ] = 0 ;
	}
	sort ( a , a + n , cmp ) ;//剪枝4:将数据从大到小排序,使得木棒的排列更灵活 
	for ( int i = fac ; i <= 70 ; i++ ) {
		a[ i ] = 0 ;
	}
	for ( int i = 1 ; i <= sum ; i++ ) 
	{
		if ( sum % i == 0 ) {
			rest = sum / i ;
			if ( a[ 0 ] > rest ) {
				continue ;
			}
			else {
				need = i ;
				flag = 0 ;
				dfs ( 0 , 0 , rest , fac ) ;//已拼完木棍的长度 已完成木棍的个数 剩余需要拼凑的长度 剩余木棍的数量 
			}
		}
	}
	cout << ans ; 
	return 0 ;
}
2023/1/26 16:47
加载中...