[CCPC 2024 Shandong I] 王国英雄题解
题目描述
《王国英雄》是一款点击解谜类的冒险游戏。游戏中的主人公为了拯救他/她的父亲,踏上了一段危险的旅途,并成为了王国的英雄。

游戏中的货币被称为“金币”,可以用于购买各种补给品,甚至还能用于完成特定任务。俗话说得好,“钱永远不嫌多”,我们的天才玩家堡堡刚刚就找到了一种变得富有的方法。游戏中有一座磨坊,磨坊主以每袋 p 金币的价格售卖面粉。游戏中还有一座酒馆,酒保以每袋 q 金币(q>p)的价格收购面粉。显然堡堡可以赚取其中的差价,但在两处地点之间移动,以及点击购买和卖出的按钮都需要时间。
更精确地,如果堡堡一次性从磨坊购买了 x 袋面粉,需要花 (ax+b) 秒以及 px 金币;如果堡堡一次性向酒馆卖出了 x 袋面粉,需要花 (cx+d) 秒,但能赚取 qx 金币。堡堡现在有 m 金币,但因为堡堡马上就要上床睡觉了,他最多只能再玩 t 秒游戏。求堡堡打完游戏时最多能持有多少金币。
输入格式
有多组测试数据。第一行输入一个整数 T(1≤T≤500)表示测试数据组数,对于每组测试数据:
第一行输入三个整数 p,a 和 b(1≤p,a≤109,0≤b≤109)。
第二行输入三个整数 q,c 和 d(p<q≤109,1≤c≤109,0≤d≤109)。
第三行输入两个整数 m 和 t(1≤m,t≤109)。
输出格式
每组数据输出一行一个整数,表示堡堡经过至多 t 秒后最多能持有多少金币。
输入输出样例
输入 #1复制
3 5 2 3 8 1 5 14 36 5 2 0 8 1 3 17 6 100 1 0 10000 1 0 99 100000
输出 #1复制
32 20 99
说明/提示
对于第一组样例数据,一种最优方案是:
- 堡堡首先从磨坊购买 2 袋面粉,花费 2×2+3=7 秒以及 5×2=10 金币。然后他把所有面粉卖给酒馆,花费 1×2+5=7 秒但赚取了 8×2=16 金币。堡堡现在有 14−10+16=20 金币,还剩 36−7−7=22 秒。
- 堡堡接下来从磨坊购买 4 袋面粉,花费 2×4+3=11 秒以及 5×4=20 金币。然后他把所有面粉卖给酒馆,花费 1×4+5=9 秒但赚取了 8×4=32 金币。堡堡现在有 20−20+32=32 金币,还剩 22−11−9=2 秒。
- 现在堡堡没有时间买卖面粉了。所以答案是 32。
对于第二组样例数据,堡堡只有时间买卖一袋面粉。所以答案是 17−5+8=20。
对于第三组样例数据,堡堡没有足够的金币购买面粉。所以答案是 99。
思路
贪心!!!
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t2,p,a,b,q,c,d,m,t,dsg,brf,few;
int main(){
cin>>t2;
while(t2--){
cin>>p>>a>>b;
cin>>q>>c>>d;
cin>>m>>t;
if(m<=p-1){
cout<<m<<endl;
}
else{
dsg=brf=few=1;
while(1){
dsg=m/p;
brf=(a+c)*dsg+b+d;
few=((q-p)*dsg+p-m%p-1)/((q-p)*dsg);
if(few*brf>=t+1){
m+=(long long)(t/brf)*(q-p)*dsg;
t%=brf;
if(t<=a+b+c+d-1){
break;
}
m+=(q-p)*((long long)(t-(b+d))/(a+c));
break;
}
t-=brf*few;
m+=few*(q-p)*dsg;
}
cout<<m<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号