欢迎光临
我们一直在努力

打卡信奥刷题(2904)用C++实现信奥题 P5365 [SNOI2017] 英雄联盟

P5365 [SNOI2017] 英雄联盟

题目描述

正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」。

现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强的方法就是:买皮肤!

小皮球只会玩 NNN 个英雄,因此,他也只准备给这 NNN 个英雄买皮肤,并且决定,以后只玩有皮肤的英雄。

NNN 个英雄中,第 iii 个英雄有 KiK_iKi 款皮肤,价格是每款 CiC_iCi Q币(同一个英雄的皮肤价格相同)。

为了让自己看起来高大上一些,小皮球决定给同学们展示一下自己的皮肤,展示的思路是这样的:对于有皮肤的每一个英雄,随便选一个皮肤给同学看。

比如,小皮球共有 555 个英雄,这 555 个英雄分别有 0,0,3,2,40,0,3,2,40,0,3,2,4 款皮肤,那么,小皮球就有 3×2×4=243 \\times 2 \\times 4 = 243×2×4=24 种展示的策略。

现在,小皮球希望自己的展示策略能够至少达到 MMM 种,请问,小皮球至少要花多少钱呢?

输入格式

第一行,两个整数 N,MN,MN,M

第二行,NNN 个整数,表示每个英雄的皮肤数量 KiK_iKi

第三行,NNN 个整数,表示每个英雄皮肤的价格 CiC_iCi

输出格式

一个整数,表示小皮球达到目标最少的花费。

输入输出样例 #1

输入 #1

3 24
4 4 4
2 2 2

输出 #1

18

说明/提示

样例解释

每一个英雄都只有 444 款皮肤,每款皮肤 222 Q币,那么每个英雄买 333 款皮肤,3×3×3≥243 \\times 3 \\times 3 \\ge 243×3×324,共花费 6×36 \\times 36×3 Q币。

数据范围

101010 组数据,第 iii 组数据满足:N≤max⁡(5,log⁡24i)N \\le \\max(5, \\log_2^4{i})Nmax(5,log24i)

100%100\\%100% 的数据:M≤1017,1≤Ki≤10,1≤Ci≤199M \\le 10^{17}, 1 \\le K_i \\le 10, 1 \\le C_i \\le 199M1017,1Ki10,1Ci199。保证有解。

C++实现

#include<bits/stdc++.h>//万能明星头
using namespace std;
const int N=1000001;
long long n,m,k[N],c[N],qm,dp[N]={1},ans;
//如题
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);//亲测优化程度基本大于快读
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>k[i];
for (int i=1;i<=n;i++) {
cin>>c[i];
qm+=c[i]*k[i];
}//输入部分
for (int i=1;i<=n;i++){//枚举前i件物品
for (int j=qm;j>=0;j){//倒序枚举花j个Q币
for (int x=0;x<=k[i]&&x*c[i]<=j;x++){//枚举买x个皮肤
dp[j]=max(dp[j],dp[jx*c[i]]*x);//转移方程
}
}
}
while (ans<=qm&&dp[ans]<m) ans++;//满足条件就++
cout<<ans<<endl;//输出
return 0;//好习惯要保持
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

赞(0)
未经允许不得转载:171主机测评 » 打卡信奥刷题(2904)用C++实现信奥题 P5365 [SNOI2017] 英雄联盟
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址