题目链接https://ac.nowcoder.com/acm/contest/52441/C
描述
牛牛打 CF,已知一场比赛有 nn 道题,第 ii 道题的满分为 aiai,时间系数为 bibi,保底分为 cici,本场比赛中每次错误提交罚 pp 分。即如果牛牛在第 xx 分钟,这道题 yy 次错误提交后通过第 ii 题,他将获得 max(ci,ai−x×bi−y×p)max(ci,ai−x×bi−y×p) 分。比赛持续 tt 分钟,即在 tt 分钟(含第 tt 分钟)内做出的题目计入总分。你已经知道了他第 ii 题需要花费的时间 xixi 和错误提交次数 yiyi ,请求出牛牛可能的最大得分。
输入描述:
第一行三个正整数 n,t,p(1≤n≤9,1≤t,p≤109)n,t,p(1≤n≤9,1≤t,p≤109)。 接下来 nn 行,每行 55 个正整数 ai,bi,ci,xi,yi(0≤ai,bi,ci,xi,yi≤109,ci≤ai)ai,bi,ci,xi,yi(0≤ai,bi,ci,xi,yi≤109,ci≤ai)。
输出描述:
一行一个正整数,表示可能的最大得分。
示例1
输入
3 120 50 500 2 150 6 1 1000 4 300 12 2 1500 6 450 120 3
输出
1266
说明
方案一:先开第 33 题,在 120120 分钟时切掉,得到 1500−120×6−50×3=6301500−120×6−50×3=630 分。此时已无法继续切题,总分 630630。 方案二:先开第 11 题,在 66 分钟时切掉,得到 438438 分。再开第 22 题,在 1818 分钟时切掉,得到 828828 分。无法切第三题,总分 12661266。 方案三:先开第 22 题,在 1212 分钟时切掉,得到 852852 分。再开第 11 题,在 1818 分钟时切掉,得到 414414 分。无法切第三题,总分 12661266。 故可能的最大得分为 12661266。
ac代码
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 13;
const int T = 1e9;
ll a[N],b[N],c[N],x[N],y[N],vis[N];
ll n,t,p;
ll ans = 0;
void dfs(int now,ll cost,int ti,int sum)
{
if(sum == n || ti == t)
{
ans = max(cost,ans);
return ;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
if(ti+x[i]>t)
{
ans = max(ans,cost);
continue ;
}
vis[i] = 1;
dfs(i,cost+max(c[i],a[i]-(x[i]+ti)*b[i]-y[i]*p),ti+x[i],sum+1);
vis[i] = 0;
}
}
}
int main(){
cin>>n>>t>>p;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i]>>c[i]>>x[i]>>y[i];
}
memset(vis,0,sizeof(vis));//vis置零
dfs(0,0,0,0);
cout<<ans<<'\n';
return 0;
}