QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#806789 | #9408. Hero of the Kingdom | jiangzhihui | TL | 0ms | 0kb | C++14 | 1.6kb | 2024-12-09 15:14:44 | 2024-12-09 15:14:45 |
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
/*
1
5 2 0
8 1 3
17 6
*/
int p,a,b,q,c,d,m,t;
cin>>p>>a>>b;
cin>>q>>c>>d;
cin>>m>>t;
while(t>=a+c+b+d && m>=p){//至少剩余时间要能再买一袋才可
int bg=m/p;//当前的钱能买多少袋
int z=bg*(q-p);//当前一次性能赚这么多钱
// 如果买一次的时间都不够怎么办:
if(t<((bg)*(a+c)+b+d)){
// cout<<(t-b-d)/(a+c)<<endl;
cout<<m+(t-b-d)/(a+c)*(q-p)<<endl;
return ;
}
if((z+m)/p == bg){//买一次后钱不够合并次数买
//多买一袋需要的钱是
int zm=(bg+1)*p;
//若时间足够那我直接买到能多买一袋为止的次数
int cm=ceil(1.0*(zm-m)/(q-p));//需合并的c次
//若时间不足
int ct=t/((a+c)*bg+b+d);
if(ct<cm){//时间不足最后一次交易
m+=ct*z;
cout<<m<<endl;
return ;
}else{//按原计划进行cm次
m+=cm*z;
t-=(cm)*((a+c)*bg+b+d);
}
}else{//一次一次买
//时间可能不够
// if(t<((bg)*(a+c)+b+d)){
// cout<<m+(t-b-d)/(a+c)*(q-p)<<endl;
// return ;
// }
t-=((bg)*(a+c)+b+d);
m+=z;
}
}
cout<<m<<endl;
}
signed main(){
freopen("1.in","r",stdin);
int qes;
cin>>qes;
while(qes--)solve();
return 0;
}
详细
Test #1:
score: 0
Time Limit Exceeded
input:
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
output:
94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 94689187991968 ...