poj 2856 Y2K Accounting Bug

水题?

分类,总共就四种情况,逐一讨论(考虑到要使利益最大)

看来做题前,还是应当冷静思考,技巧比技术更具效率。

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

return 0;
}

用这个方法解此题十分方便,但是不能轻易满足,因为这个题目的特性,我尝试用dfs来解此题,虽然超时了,但是作为一种尝试,应当记下来

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
long long month[12]; long long s,d,c,maxx=0,step;//s表示赚,d表示亏,c表示满足的情况的序数
long long sum[5000];//sum=-1,表示亏;sum=1,表示赚;sum=0,表示不和要求
long long getsum()
{
long long ss=0;
for(int i=0;i<12;i++)
ss+=month[i];
return ss;
}
long long check()
{
for(long long i=0;i<8;i++)
{
if((month[i]+month[i+1]+month[i+2]+month[i+3]+month[i+4])>=0)
{
return 0;//表示不满足题目要求
}
}
return 1;//表示满足题目的要求
}
void dfs(long long m,long long t)
{
if(t==step)
{
if(check()){sum[c++]=getsum();}
return;
}
if(t>step||m>11)return;
month[m]=s;
dfs(m+1,t+1);
month[m]=-d;
dfs(m+1,t);
return;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(cin>>s>>d)
{
memset(sum,0,sizeof(sum));
c=0;
for(long long i=0;i<12;i++)
month[i]=0-d;
//for(long long i=0;i<12;i++)
//cout<<month[i]<<endl;
for(step=0;step<11;step++)
{
dfs(0,0);
}
maxx=-999999999;
for(long long i=0;i<c;i++)
{
if(maxx<sum[i])maxx=sum[i];
}
if(maxx>=0)cout<<maxx<<endl;
else printf("Deficit ");
}
return 0;
}

看到这么冗长的代码,超时是必然,但是作为一种转化方法,我希望自己能够灵活掌握。

希望下次在我运用转化的时候,能够是简化题目,而不是像这次一样弄巧成拙。

原文地址:https://www.cnblogs.com/plank-george-zzo/p/3215335.html