zoj3657-The Little Girl who Picks Mushrooms

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;

}


 

 

你可能感兴趣的:(oom)