题目:链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
牛牛打 CF,已知一场比赛有 n 道题,第 i 道题的满分为 ai,时间系数为 bi,保底分为 ci,本场比赛中每次错误提交罚 p 分。即如果牛牛在第 x 分钟,这道题 y 次错误提交后通过第 i 题,他将获得 max(ci,ai−x*bi−y*p) 分。比赛持续 t 分钟,即在 t 分钟(含第 t 分钟)内做出的题目计入总分。你已经知道了他第 i 题需要花费的时间 xi 和错误提交次数 yi ,请求出牛牛可能的最大得分。
分析:刚开始以为是直接把每一次的得分求出来然后排序就可以,但是发现并不是这样,忘记了还有时间限制。现在有两个限制条件:时间和分数,所以可以用dfs来搜索(其实是枚举啦,找到最大值就可以)
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N=11;
int a[N],b[N],c[N],x[N],y[N];
int n,t,p;
bool vis[N];
int mx=0;
void dfs(int sum,int time){
mx=max(sum,mx);
for(int i =1;i<=n;i++){
if(vis[i]==true||time+x[i]>t) continue;
vis[i]=true;
int res=max(c[i],a[i]-(time+x[i])*b[i]-y[i]*p);
dfs(sum+res,time+x[i]);
vis[i]=false;
}
return ;
}
signed main(){
cin>>n>>t>>p;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i]>>x[i]>>y[i];
}
for(int i =1;i<=n;i++){
dfs(0,0);
}
cout<<mx<<endl;
}