NC249073. 开题顺序
描述
输入描述
第一行三个正整数 。
接下来 行,每行 个正整数 。
输出描述
一行一个正整数,表示可能的最大得分。
示例1
输入:
3 120 50 500 2 150 6 1 1000 4 300 12 2 1500 6 450 120 3
输出:
1266
说明:
方案一:先开第 题,在 分钟时切掉,得到 分。此时已无法继续切题,总分 。C++(g++ 7.5.0) 解法, 执行用时: 10ms, 内存消耗: 536K, 提交时间: 2023-03-25 22:27:45
#include <bits/stdc++.h> using namespace std; int main(){ int n; long long t,p,ans=0; cin>>n>>t>>p; vector<long long> a(n),b(n),c(n),x(n),y(n),ord(n); for(int i=0;i<n;i++) cin>>a[i]>>b[i]>>c[i]>>x[i]>>y[i]; for(int i=0;i<n;i++) ord[i]=i; while(next_permutation(ord.begin(),ord.end())){ long long tt=0,sum=0; for(int i=0;i<n;i++){ tt=tt+x[ord[i]]; if(tt<=t) sum=sum+max(c[ord[i]],a[ord[i]]-tt*b[ord[i]]-y[ord[i]]*p); }ans=max(ans,sum); } cout<<ans; return 0; }
Python3 解法, 执行用时: 49ms, 内存消耗: 4616K, 提交时间: 2023-03-24 19:26:48
n, t, p = map(int, input().split()) s = [list(map(int, input().split())) for _ in range(n)] r = [0] f = [False] * n def d(i, v, m): r[0] = max(r[0], v) if i == n: return for j in range(n): if f[j]: continue if t - m < s[j][3]: continue f[j] = True q = s[j] d(i + 1, v + max(q[2], q[0] - (m + q[3]) * q[1] - p * q[4]), m + q[3]) f[j] = False d(0, 0, 0) print(r[0])
C++(clang++ 11.0.1) 解法, 执行用时: 8ms, 内存消耗: 464K, 提交时间: 2023-05-09 12:04:44
#include<bits/stdc++.h> using namespace std; long long i,n,t,p,a[10],b[10],c[10],x[10],y[10],q[10],s,d,e; int main() { cin>>n>>t>>p; for(i=1;i<=n;i=i+1) { cin>>a[i]>>b[i]>>c[i]>>x[i]>>y[i]; q[i]=i; } do { d=0;e=0; for(i=1;i<=n;i=i+1) { d=d+x[q[i]];if(d>t)break; e=e+max(c[q[i]],a[q[i]]-d*b[q[i]]-y[q[i]]*p); } s=max(s,e); } while(next_permutation(q+1,q+n+1)); cout<<s; return 0; }
pypy3 解法, 执行用时: 114ms, 内存消耗: 22028K, 提交时间: 2023-03-24 19:34:03
import itertools n,t,p=map(int,input().split()) l=[] for _ in range(n): a,b,c,x,y=map(int,input().split()) l.append([a,b,c,x,y]) ans=0 for i in itertools.permutations(l,n): time=0 tmp=0 for k in i: time+=k[3] if time>t: break tmp+=max(k[2],k[0]-time*k[1]-k[4]*p) ans=max(ans,tmp) print(ans)