原题地址
AC代码
#include <iostream>
using namespace std;
long long int list[12];
long long int maxi;
long long int mi(int a,int b){
if(b==0)return 1;
if(b&1)return a*mi(a,b-1);
else return mi(a,b/2)*mi(a,b/2);
}
int tell(){
for (int i = 0; i < 8; ++i) {
long long int sum = 0;
for (int j = i; j < i+5; ++j) {
sum+=list[j];
}
if(sum>0)return 0;
}
return 1;
}
void judge(long long int a,long long int b,int now){
if(now==12)return;
list[now]=a;
if(tell()){
long long int sum = 0;
for (int i = 0; i < 12; ++i) {
sum+=list[i];
}
if(sum>maxi)maxi=sum;
}
judge(a,b,now+1);
list[now]=b;
judge(a,b,now+1);
}
int main() {
long long int a,b;
while(cin>>a>>b){
maxi = -mi(2,62);
b=-b;
for (int i = 0; i < 12; ++i) {
list[i]=b;
}
judge(a,b,0);
if(maxi>0)cout<<maxi<<endl;
else cout<<"Deficit"<<endl;
}
return 0;
}
思路和题目题解
其实还是用DFS解的,一共有12个月,每个月的盈余/亏损只会是s/d,按照排列组合的方式,也就只有212种情况而已,DFS的时间刚好够用。
初始化我们数组list的每一项为亏损,然后把s和d丢进judge()之中进行DFS的操作,按照顺序flip每一项的值,找出每次flip中符合情况(用tell()来判断)的最大值即可。