1
1
using System ;
2
+ using System . Collections . Immutable ;
2
3
using System . Collections . Generic ;
3
4
using System . Linq ;
4
5
@@ -15,36 +16,34 @@ int[] Parse(string input) =>
15
16
input . Split ( "\n " ) . Select ( int . Parse ) . ToArray ( ) ;
16
17
17
18
long Solve ( int [ ] nums , int groups ) {
18
- var minLength = int . MaxValue ;
19
- var min = long . MaxValue ;
20
- foreach ( var part in Pick ( nums , 0 , nums . Sum ( ) / groups ) ) {
21
- if ( part . c < minLength ) {
22
- minLength = part . c ;
23
- min = part . mul ;
24
- } else if ( part . c == minLength ) {
25
- min = Math . Min ( min , part . mul ) ;
19
+ var mul = ( ImmutableList < int > l ) => l . Aggregate ( 1L , ( m , x ) => m * x ) ;
20
+
21
+ for ( var i = 0 ; i < nums . Length ; i ++ ) {
22
+ var parts = Pick ( nums , i , 0 , nums . Sum ( ) / groups ) ;
23
+ if ( parts . Any ( ) ) {
24
+ return parts . Select ( mul ) . Min ( ) ;
26
25
}
27
26
}
28
- return min ;
27
+ throw new Exception ( ) ;
29
28
}
30
29
31
- IEnumerable < ( int c , long mul ) > Pick ( int [ ] nums , int i , int sum ) {
30
+ IEnumerable < ImmutableList < int > > Pick ( int [ ] nums , int count , int i , int sum ) {
32
31
if ( sum == 0 ) {
33
- yield return ( 0 , 1 ) ;
32
+ yield return ImmutableList . Create < int > ( ) ;
34
33
yield break ;
35
34
}
36
35
37
- if ( sum < 0 || i >= nums . Length ) {
36
+ if ( count < 0 || sum < 0 || i >= nums . Length ) {
38
37
yield break ;
39
38
}
40
39
41
40
if ( nums [ i ] <= sum ) {
42
- foreach ( var x in Pick ( nums , i + 1 , sum - nums [ i ] ) ) {
43
- yield return ( x . c + 1 , x . mul * nums [ i ] ) ;
41
+ foreach ( var x in Pick ( nums , count - 1 , i + 1 , sum - nums [ i ] ) ) {
42
+ yield return x . Add ( nums [ i ] ) ;
44
43
}
45
44
}
46
45
47
- foreach ( var x in Pick ( nums , i + 1 , sum ) ) {
46
+ foreach ( var x in Pick ( nums , count , i + 1 , sum ) ) {
48
47
yield return x ;
49
48
}
50
49
}
0 commit comments