poj 2586

题目链接:http://poj.org/problem?id=2586

这题依然是贪心算法。就是题意有点难理解。。大意是给出盈利和亏损,然后只知道每连续的五个月(总共八个··1-5 2-6 3-7······8-12)一定是亏损的,,要求出最后是否有可能盈利,最大可能是多少。。

思路:我的想法是将1-5月的每个月的盈利或亏损的情况求出来,,简单的找规律会发现把这五个月平移到6-10,1、2月给11、12就行了。。求前五个月的详细情况我已开始居然想用类似dfs的方法做···· 估计是之前专题里练了两题导致的吧····就是先将五个月都放上盈利的,再逐一替换最后面的那个数,知道这五个月总共变成了亏损就行了。。

后来又仔细想了一下发现只要简单的算术就可以把前五个月的情况求出来。。于是我又写了一下。。

这里附上ac代码一。。

#include<stdio.h>
#include<string.h>
int s,d;
int flag=0;
int a[15],p[5];
int sum()
{
	int i,q=0;
	for(i=0;i<5;i++)
	{
		q+=a[i];
	}
	return q;
}
void dfs(int depth)
{
	int i;
	if(flag) return;
	if(depth==5)
	{
		if(sum()<0)
		flag=1;
		return;
	}
	for(i=0;i<2;i++)
	{
		a[depth]=p[i];
		dfs(depth+1);
		if(flag) break;
	}
}
int main ()
{
	while (scanf("%d%d",&s,&d)==2)
	{
		flag=0;
		p[0]=s;
		p[1]=-d;
		dfs(0);
		int temp=0;
		/*for(int i=0;i<5;i++)
		printf("%d ",a[i]);*/
		for(int i=5;i<12;i++)
			a[i]=a[i-5];
		for(int i=0;i<12;i++)
			temp+=a[i];
		if(temp>0)
		printf("%d\n",temp);
		else printf("Deficit\n");
	}
	return 0;
}
ac代码二:

#include<stdio.h>
int a[15];
int main ()
{
	int s,d;
	while (scanf("%d%d",&s,&d)==2)
	{
		int sum=0;
		int i,j;
		for(i=5;i>=0;i--)       //一定要写成i>=0   若写成i>0可能出现一种情况i=1的时候sum>0 然后由于i>0退出了  sum仍然>0 
		{                      //写成i>=0 则上面那种情况变成i=1时sum>0,i=0时sum<0 break 
			sum=i*s-(5-i)*d;
			if(sum<0)break;
		}
		for(j=0;j<i;j++)
			a[j]=s;
		for(j=i;j<5;j++)
			a[j]=-d;
		for(i=5;i<12;i++)
		{
			a[i]=a[i-5];
			sum+=a[i];
		}
		if(sum>0)
		printf("%d\n",sum);
		else printf("Deficit\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值