zoukankan      html  css  js  c++  java
  • zoj3657The 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;
    }


  • 相关阅读:
    第八章 1 元组简介
    第七章 5 字典生成式
    第七章 4 字典的视图操作、字典的遍历、字典的特点
    第七章 3 字典的常用操作(增删改查)
    第七章 2 字典的创建以及字典元素的获取
    第七章 1 字典介绍
    Java 中 Executors.newSingleThreadExecutor() 与Executors.newFixedThreadPool(1)有什么区别
    Java 使用线程池执行若干任务
    使用Jacoco获取 Java 程序的代码执行覆盖率
    基于 Golang 完整获取百度地图POI数据的方案
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3065662.html
Copyright © 2011-2022 走看看