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个月吃亏
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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个月的最后面开始进行亏损贪心计算;
因为区间是向后重叠的,所以尽量把亏损的月份放在后面,把五个月从后往前的设为亏损直到总收入为负。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }