社区讨论

薛定谔的猫

P1120[CERC 1995] 小木棍参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo2v37ue
此快照首次捕获于
2023/10/23 20:16
2 年前
此快照最后确认于
2023/10/23 20:16
2 年前
查看原帖
十分奇怪的一个错误,如果加上调试语句就能过样例,不加就 RE(代码基本与第一篇题解相同)
CPP
# include <bits/stdc++.h>
using namespace std ;
const int N = 70 ;
int n , m , a[N] , nxt[N] , cnt , sum , len ; bool use[N] , flag ;
inline bool cmp ( int a , int b ) { return a > b ; }
inline void dfs ( int k , int lst , int rest ) {
	cout << k << " " << lst << " " << rest << "\n" ; // 就是这句话
	if ( ! rest ) {
		if ( k == m ) { flag = 1 ; return ; }
		int i ; for ( int i = 1 ; i <= n ; i++ ) if ( ! use[i] ) break ;
		use[i] = 1 ; dfs ( k + 1 , i , len - a[i] ) ; use[i] = 0 ;
		if ( flag ) return ;
	} int l = lst + 1 , r = cnt , mid ;
	while ( l < r ) {
		mid = l + r >> 1 ; if ( a[mid] <= rest ) r = mid ;
		else l = mid + 1 ;
	} for ( int i = l ; i <= cnt ; i ++ ) {
		if ( ! use[i] ) {
			use[i] = 1 ; dfs ( k , i , rest - a[i] ) ;
			use[i] = 0 ; if ( flag ) return ;
			if ( rest == a[i] || rest == len ) return ;
			i = nxt[i] ; if ( i == cnt ) return ; 
		}
	}
}
int main () {
	// ios :: sync_with_stdio ( false ) ; cin . tie ( 0 ) ; cout . tie ( 0 ) ;
	cin >> n ; for ( int i = 1 ; i <= n ; i ++ ) {
		int x ; cin >> x ; if ( x > 50 ) continue ; a [ ++ cnt ] = x ; sum += x ;
	} sort ( a + 1 , a + cnt + 1 , cmp ) ; nxt[cnt] = cnt ;
	for ( int i = cnt - 1 ; i > 0 ; i -- ) if ( a[i] == a [ i + 1 ] )
		nxt[i] = nxt [ i + 1 ] ; else nxt[i] = i ; use[1] = 1 ;
	for ( len = a[1] ; len <= sum >> 1 ; len ++ ) {
		if ( sum % len != 0 ) continue ; m = sum / len ; 
		dfs ( 1 , 1 , len - a[1] ) ; if ( flag ) 
			return cout << len << "\n" , 0 ;
	} cout << sum << "\n" ; return 0 ;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...