牛客网练习赛61 A+B
A.打怪
思路:先判定当小怪的攻击力为0时,你能杀无数只怪,因为小怪A不动你,然后再计算每个小怪最多能给你造成多少伤害(用小怪的血量除以你的攻击力,也就是你砍它几下它会死,你先手,所以小怪肯定比你少砍一下,所以当a%y==0的时候小怪能A你a/y-1下,再乘以它的攻击力,如果a%y!=0说明你除了a/y之外还要多A一下,所以就是a/y-1+1所以就是a/y再乘小怪的攻击力),如果小怪对你造不成伤害,你就能杀无数只。然后用你的血量除以每个小怪对你的伤害。就是你能杀多少只怪。
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int main() { int n; cin >> n; while(n--) { int sum=0; int x,y,a,b; cin >> x >> y >> a >> b; if(b==0) { cout <<"-1" <<endl; continue; } int f; if(a%y==0) { f=(a/y-1)*b; } else { f=(a/y)*b; } if(f==0) { cout << "-1"<<endl; continue; } if(x%f==0) { sum=x/f-1; } else { sum=x/f; } cout << sum <<endl; } return 0; }
B.吃水果
思路:贪心一波,保证处理比较小的数,小的数倍增(sum++)一直到大于大的数的一半的时候,就一起减1(sum++),然后当小的数等于大的数/2的时候,小的数再倍增一次,两数相等了,输出sum+n就行了。
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cstdio> using namespace std; int n,sum; int main() { cin >> n; while(n--) { int x,y; scanf("%d%d",&x,&y); if(x>y) { swap(x,y); } sum=0; while(x!=y) { if(x<=y/2) { x*=2; sum++; } else { x--; y--; sum++; } } cout << sum+y <<endl; } }