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;

}

 

 

你可能感兴趣的:(count)