列表

详情


NC249073. 开题顺序

描述

牛牛打 CF,已知一场比赛有 n 道题,第 i 道题的满分为 a_i,时间系数为 b_i,保底分为 c_i,本场比赛中每次错误提交罚 p 分。即如果牛牛在第 x 分钟,这道题 y 次错误提交后通过第 i 题,他将获得 max(c_i,a_i-x\times b_i-y\times p) 分。比赛持续 t 分钟,即在 t 分钟(含第 t 分钟)内做出的题目计入总分。你已经知道了他第 i 题需要花费的时间 x_i 和错误提交次数 y_i ,请求出牛牛可能的最大得分。

输入描述

第一行三个正整数 n,t,p(1\le n\le9,1\le t,p\le10^9)
接下来 n 行,每行 5 个正整数 a_i,b_i,c_i,x_i,y_i(0 \le a_i,b_i,c_i,x_i,y_i \le 10^9,c_i \le a_i)

输出描述

一行一个正整数,表示可能的最大得分。

示例1

输入:

3 120 50
500 2 150 6 1
1000 4 300 12 2
1500 6 450 120 3

输出:

1266

说明:

方案一:先开第 3 题,在 120 分钟时切掉,得到 1500-120\times6-50\times3=630 分。此时已无法继续切题,总分 630

方案二:先开第 1 题,在 6 分钟时切掉,得到 438 分。再开第 2 题,在 18 分钟时切掉,得到 828 分。无法切第三题,总分 1266

方案三:先开第 2 题,在 12 分钟时切掉,得到 852 分。再开第 1 题,在 18 分钟时切掉,得到 414 分。无法切第三题,总分 1266

故可能的最大得分为 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)

上一题