Codeforces 1296D - Fight with Monsters


題目大意:

n 只怪獸,每只的血量為 h[i] ,你的攻擊力為 a ,你的對手攻擊力為 b

打每只怪獸時,都是你先出手,然后你的對手出手,這樣輪流攻擊

如果是你給予了怪獸最后一擊,你就能得到一分

你還有 k 次機會能讓你的對手暫停行動一回合

問你最多能拿到多少分

 

解題思路:

記你加上你的對手兩個人各攻擊一次造成的傷害為 s=a+b

貪心可得,如果想節省那 k 次機會,應該和對手一起把怪獸耗到只剩一點血,即能在最后一回合殺死的情況時

即怪獸減去的血量為 s 的倍數,表示經過了這么多回合后,怪獸的血量降到了 s 以內,能夠決定是你或者你的對手給予的最后一擊了

對於血量的計算,可以用 h=(h-1)%s+1 來降低到 1~s 的范圍內

然后判斷這個 h ,如果h屬於1~a,說明肯定是你擊敗這只怪獸,直接點數加一,考慮下一只

但如果是在 a+1~s 這個區間,說明如果你不使用那 k 次機會的話,會由對手給予最后一擊

而如果要使用這些機會,則需要使用【 (h-a)/a 向上取整】次機會才行

貪心易得,需要把這些機會從小到大排序,然后先把機會用在需要次數少的怪獸上

全部處理完后輸出答案即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
    vector<ll> v;
    ll n,a,b,k,s,h,d,i,len,ans=0;
    cin>>n>>a>>b>>k;
    s=a+b;
    while(n--){
        cin>>h;
        d=(h-1)%s+1;
        if(d<=a)
            ans++;
        else
            v.push_back(d-a);
    }
    sort(v.begin(),v.end());
    len=v.size();
    for(i=0;i<len;i++){
        d=(v[i]+a-1)/a;//向上取整
        if(k>=d){
            k-=d;
            ans++;
        }
    }
    cout<<ans<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM