題目大意:
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; }