Educational Codeforces Round 94 (Rated for Div. 2) 参与排名人数15221
[codeforces 1400B] RPG Protagonist 顺藤摸瓜
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1400/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - RPG Protagonist | GNU C++17 | Accepted | 46 ms | 200 KB |
题目大意:两个人,一个人能拿p个单元的物体,另一个能拿f个单元的物体,有cnts把剑,cntw个斧头,每把剑由s个单元构成,每个斧头由w个单元构成,要求两个人能拿剑和斧头的数量最多,输出这个数量。
基本思路:我们需要让每把剑的单元数小于每个斧头的单元数,若不能满足,交换两者单元数,交换两者数量。设一个人能拿x1把剑,y1个斧头,另一个人能拿x2把剑,y2个斧头,要求x1+y1+x2+y2的数量最大,若开四个循环,该问题很快解决,不过却严重超时。但是可以这样考虑,枚举x1,那么y1就可以算出,x2就可以算出,y2就可以算出.
部分样例模拟如下:
1 19
1 3
19 5
3
该样例等价于
1 19
3 1
5 19
3
开始枚举
x1=0:y1=(1-0*5)/19=0,x2=min(19/5,3)=3,y2=(19-5*3)/19=0.x1+y1+x2+y2=0+0+3+0=3
x1=1:因1-1*5<0,此处循环跳过。
x1=2:因1-2*5<0,此处循环跳过。
x1=3:因1-3*5<0,此处循环跳过。
最后,输出3.
AC代码如下:
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
int main(){
LL p,f,a,b,s,w,x1,x2,y1,y2,ans;//用long long的目的是省去运算中int溢出的烦恼。
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld%lld%lld%lld",&p,&f,&a,&b,&s,&w);
ans=0;
if(s>w)swap(a,b),swap(s,w);
for(x1=0;x1<=a;x1++){
if(p-x1*s<0)continue;//此处循环跳过
y1=(p-x1*s)/w;//可算出y1
y1=min(y1,b);//但y1不能超过总数b
x2=min(a-x1,f/s);//f/s可算出x2,但x2不能超过剩下数量a-x1
y2=min((f-x2*s)/w,b-y1);//(f-x2*s)/w可算出y2,但y2不能超过剩下数量b-y1
ans=max(ans,x1+x2+y1+y2);//计算数量的最大值
}
printf("%lld\n",ans);
}
return 0;
}