POJ 2586 Y2K 会计错误(贪心)

  因此这题可用贪心法去求解:
    从1月份开始,选择当月是盈或亏,但尽可能选择为盈利,
      当且仅当无法满足【连续5月必亏损】这个条件时,当月才选择亏损
  由于组合情况较少,可以把每5个月的所有盈亏组合情况列举出来:
  ① 当 s >= 4d 时 (即1个月的盈利抵得上4个月的亏损),
      无论如何组合,都无法满足【连续5月必亏损】的前提,
      因此为了满足这种情况,只可能所有月份均亏损
      即亏损月份为 [1-12]
      全年无利润
  ② 当 s < 4d (但2s >= 3d) 时 (即1个月的盈利刚好小于4个月的亏损),
	  此时只需保证每连续5个月至少有4个月是亏损即可,
	  根据贪心逻辑,全年盈亏月份为:sddddsddddsd
	  即盈利月份为 1、6、11
	    亏损月份为 [2-5]、[7-10]、12
	  全年最大利润为: 3s - 9d
  ③ 当 2s < 3d (但3s >= 2d)时 (即2个月的盈利刚好小于3个月的亏损),
	  此时只需保证每连续5个月至少有3个月是亏损即可,
	  根据贪心逻辑,全年盈亏月份为:ssdddssdddss
	  即盈利月份为 [1-2]、[6-7]、[11-12]
	    亏损月份为 [3-5]、[8-10]
	  全年最大利润为: 6s - 6d
  ④ 当 3s < 2d (但4s >= d)时 (即3个月的盈利刚好小于2个月的亏损),
	  此时只需保证每连续5个月至少有2个月是亏损即可,
	  根据贪心逻辑,全年盈亏月份为:sssddsssddss
	  即盈利月份为 [1-3]、[6-8]、[11-12]
	    亏损月份为 [4-5]、[9-10]
	  全年最大利润为: 8s - 4d
  ⑤ 当 4s < d 时 (即4个月的盈利刚好小于1个月的亏损),
	  此时只需保证每连续5个月至少有1个月是亏损即可,
	  根据贪心逻辑,全年盈亏月份为:ssssdssssdss
	  即盈利月份为 [1,4]、[6-9]、[11-12]
	    亏损月份为 5、10
	  全年最大利润为: 10s - 2d

AC代码:

#include
int main()
{
	int s,d;
	while(scanf("%d %d",&s,&d)!=EOF){
		int surplus=0;
		if(4*s<d){
			surplus = 10 * s - 2 * d;
			
		} else if(3 * s < 2 * d) {
			surplus = 8 * s - 4 * d;
 
		} else if(2 * s < 3 * d) {
			surplus = 6 * s - 6 * d;
 
		} else if(s < 4 * d) {
			surplus = 3 * s - 9 * d;
 
		} else {
			surplus = -1;
		}
		if(surplus<0)
			printf("Deficit\n");
		else
			printf("%d\n",surplus);
	}
	return 0;
}

你可能感兴趣的:(算法,c语言)