NC53680. 「金」点石成金
描述
她决定去捡一些石头,施展点石成金魔法
帕秋莉将捡到的n块石头排成一排,并决定将一些石头点为黄金
对于第i块石头,如果将其变为黄金,会增加ai的财富,消耗bi的魔法(需要说明的是,就算魔法值不够,也可以操作,操作后魔法值归零)
否则,帕秋莉将会回复ci的魔法,但减少di的财富(财富值同理,可以无限制减少)
收益值=财富值*魔法值
(提示:数值不会变为负数,即任何时候,如果数值小于了0,它会立即变为0)
输入描述
第一行一个整数n
接下来n行,每行四个数,分别代表对应石头的a,b,c,d值
输出描述
一个整数表示答案
示例1
输入:
2 1926 817 2003 627 1949 1001 1234 4321
输出:
1952898
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 556K, 提交时间: 2022-12-29 15:20:04
#include<bits/stdc++.h> using namespace std; const int N=20; typedef long long ll; ll n,ans,a[N],b[N],c[N],d[N]; void dfs(ll i,ll v,ll m) { if(i==n) { ans=max(ans,v*m); return ; } dfs(i+1,v+a[i],max(0LL,m-b[i])); dfs(i+1,max(0LL,v-d[i]),m+c[i]); } int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]>>b[i]>>c[i]>>d[i]; dfs(0,0,0); cout<<ans<<endl; return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 432K, 提交时间: 2022-08-17 10:56:57
#include<bits/stdc++.h> using namespace std; long long n,a[20],b[20],c[20],d[20],s; void dfs(long long x,long long y,long long z) { if(x>n) { s=max(s,y*z); return; } dfs(x+1,y+a[x],max(0ll,z-b[x])); dfs(x+1,max(0ll,y-d[x]),z+c[x]); } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i]>>d[i]; dfs(1,0,0); cout<<s; }
pypy3(pypy3.6.1) 解法, 执行用时: 158ms, 内存消耗: 25824K, 提交时间: 2020-05-26 19:29:15
n=int(input()) a,b,c,d=[0]*n,[0]*n,[0]*n,[0]*n for i in range(n):a[i],b[i],c[i],d[i]=list(map(int,input().split())) ans=0 def dfs(i,ai,bi): global ans if i==n:ans=max(ans,ai*bi);return dfs(i+1,ai+a[i],bi-b[i]if bi-b[i]>0 else 0);dfs(i+1,ai-d[i]if ai-d[i]>0 else 0,bi+c[i]) dfs(0,0,0) print(ans)