poj 2586 Y2K Accounting Bug

题意:每个月会给出一个财务报告:赢利或者亏空 如果赢利则赢利s,如果亏空则亏空d
(12个月都一样,只有赢利s或者亏空d两种情况)
每五个月也会给出一个报告(1~5 ,2~6 。。。)一年一共有8次这样的报告,已知这8次都报告亏空
问整年情况:如果亏空则输出Deficit,如果赢利,输出整年可能赢利的最大值;

解析:因为每5个月的报账都为吃亏,所有连气儿的5个月里至少有1个月为吃亏,则可能产生最优解的景象为如下4种

 

1 2 3 4 5 6 7 8 9 10 11 12

 

s s s s d s s s s d s s //每5个月里只有1个月吃亏

 

s s s d d s s s d d s s //每5个月里只有2个月吃亏

 

s s d d d s s d d d s s //每5个月里只有3个月吃亏

 

s d d d d s d d d d s d //每5个月里只有4个月吃亏
View Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
using namespace std;
int Result( int s , int d )
{
    if( 4*s < d ) return 10*s - 2*d;
    if( 3*s < 2*d ) return 8*s - 4*d;
    if( 2*s < 3*d ) return 6*s - 6*d;
    if( s < 4*d )  return 3*s - 9*d;
    return -1;
}
int main(  )
{ 
    int d,s;
    while( scanf( "%d %d",&s,&d )==2 )
    {
        int ans = Result( s ,d );
        if( ans <= 0 )printf( "Deficit\n" );
        else printf( "%d\n",ans );    
    }
    //system( "pause" );
    return 0;
}

 

贪心:8次的循环代表8次亏损的计算,把五个月放在一起看,在满足五个月的总收入为负的情况下尽可能使亏损最少,初始全部设为盈余,
在将每5个月的最后面开始进行亏损贪心计算;
因为区间是向后重叠的,所以尽量把亏损的月份放在后面,把五个月从后往前的设为亏损直到总收入为负。
View Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cstring>
using namespace std;

int main(  )
{
    int d,s;
    int month[12];
    while( scanf( "%d %d",&s,&d )==2 )
    {
        int d_month=0,s_month;
         memset( month , 0,sizeof( month ) );
         for( int i = 0; i < 8 ; i ++ )
         {
             while( 1 )
             {
                 d_month = 0;
                 for( int j = 0; j < 5 ; j++ )
                      d_month += month[j+i];
                 s_month = 5 - d_month;
                 if( s_month*s >=d*d_month )
                 {
                     for( int j = i+4 ; j >= 0 ; j-- )
                     {
                          if( month[j]==0 )
                          {
                              month[j] = 1;
                              break;        
                          }        
                     }        
                 }
                 else break;        
             }        
         }    
         d_month = 0;
         for( int i = 0 ; i < 12 ; i ++ )
         {
             d_month += month[i];        
         }
        
         s_month = 12 - d_month;
         int ans = s_month*s - d*d_month; 
    //     printf( "%d %d %d %d\n",d_month,d*d_month,s_month,s_month*s );
         if( ans >=0 ) printf( "%d\n",ans );
         else printf( "Deficit\n" );
    }
    //system( "pause" );
    return 0;
}

 



posted @ 2012-06-29 10:33  wutaoKeen  阅读(140)  评论(0编辑  收藏  举报