http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4880
题目之前没完全理解,感觉很难,后来才发现不一定5座山都要采到,就是说 n <= 5;
然后分几种情况讨论,就可以了;
当 n <= 3; 直接诶输出 1024 ;
当 n == 5 ; 先找到三个和为1024的倍数的情况,然后,取剩下的两个数的和小于1024的部分;
当 n == 4 ; 这种是最需要注意的地方,当找到三项和为1024的倍数时,直接输出1024
否则直接找到小于1024 的两个数的和即可
// File Name: poj3657.cpp // Author: bo_jwolf // Created Time: Tuesday, May 07, 2013 PM08:51:41 HKT #include<vector> #include<list> #include<map> #include<set> #include<deque> #include<stack> #include<queue> #include<bitset> #include<algorithm> #include<functional> #include<numeric> #include<utility> #include<sstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; int i , j , z , x , y ; int a[ 6 ] ; int main() { int n ; int sum , ans , max ; while( scanf( "%d" , &n ) != EOF ) { sum = 0 ; for( i = 0 ; i < n ; i++ ) { scanf( "%d" , &a[ i ] ) ; sum += a[ i ] ; } if(n >= 0 && n <= 3 ) { printf( "1024\n" ) ; continue ; } if( n == 5 ) { ans = 0 ; for( i = 0 ; i < 5 ; i++ ) for( j = i+1 ; j < 5 ; j++ ) for( z = j + 1 ; z < 5 ; z++ ) if( ( a[ i ] + a[ j ] + a[ z ] ) % 1024 == 0 ) { int tmp = sum - a[ i ] - a[ j ] - a[ z ] ; while( tmp > 1024) tmp -= 1024 ; if( tmp > ans ) ans = tmp ; } printf( "%d\n" , ans ); continue ; } if( n == 4 ) { ans = 0 ; for( i = 0 ; i < 4 ; i++ ) for( j = i + 1 ; j < 4 ; j++ ) for( z = j + 1 ; z < 4 ; z++ ) { if( ( a[ i ] + a[ j ] + a[ z ] ) % 1024 == 0 ) { ans = 1024 ; } } if( ans > 0 ) { printf( "1024\n" ); continue ; } for( i = 0 ; i < 4 ; i++ ) for( j = i + 1 ; j < 4 ; j++ ) { int tmp = a[ i ] + a[ j ] ; while( tmp > 1024 ) tmp -= 1024 ; if( tmp > ans ) ans = tmp ; } printf( "%d\n" , ans ) ; continue ; } } return 0; }