牛客网练习赛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;
    }
 } 

猜你喜欢

转载自www.cnblogs.com/zust-lms/p/12678068.html