社区讨论
薛定谔的猫
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 条回复,欢迎继续交流。
正在加载回复...