ZOJ1867 POJ2586 Y2K Accounting Bug

1435 ワード

坑父の貪欲さ...
毎月利益が出るか、損をするかです.
そして5ヶ月ごとにこの5ヶ月の財務諸表(1~5、2~6...)を作成し、計8回の報告書はいずれも損失した.
年間利益が得られるかどうかを聞くと、最大値が与えられる.
年間利益の最大値を保証するには、年間利益の月が最大でなければならないと同時に、5ヶ月連続の総報告書が損失することを保証しなければならない.だから私たちは以下の5つの総状況があります.
  • SSSSDSSSSDSS
  • SSSDDSSSDDSS
  • SSDDDSSDDDSS
  • SDDDDSDDDDSD
  • DDDDDDDDDDDD

  • どうしてこんなに並んでいるのですか.このように配列することで、5ヶ月ごとに存在する損失月が固定されることが保証される.同時に[1~5]月中、損失月を最後に年間の損失月が最も少ないことを保証することができる.例えば3では、2,3,4月に損失を出した場合、年間の損失月は7.
    そこで、私たちはまず5ヶ月の損失が利益より多いかどうかを判断して、それから年間利益があるかどうかを求めて、利益がいくらですか.
    #ifdef _MSC_VER
    #define DEBUG
    #define _CRT_SECURE_NO_DEPRECATE
    #endif
    
    #include <fstream>
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <string>
    #include <limits.h>
    #include <algorithm>
    #include <math.h>
    #include <numeric>
    #include <functional>
    #include <ctype.h>
    #define MAX 100010
    using namespace std;
    
    int main(void)
    {
    #ifdef DEBUG  
      freopen("../stdin.txt","r",stdin);
      freopen("../stdout.txt","w",stdout); 
    #endif  
    
      int s,d;
    
      while(~scanf("%d%d",&s,&d))
      {
    		int ans=-1;
    		for(int i=1;i<=4;++i)
    			if(i*d>s*(5-i))
    			{
    				int mon=i*2+(i==4);
    				ans=max(ans,(12-mon)*s-mon*d);
    			}
    		if(ans>0)
    			printf("%d
    ",ans); else printf("Deficit
    "); } return 0; }