環境里有 $n$ 個怪物,他們的生命值用一個正整數表示。現在,你可以使用兩種魔法,對怪物進行攻擊。當怪物的生命值小於等於 $0$ 時,他便被消滅了。
-
魔法箭,對摸個生物造成 $k$ 點傷害,對一個生物最多使用一次,但沒有使用次數限制。
-
褻瀆,對所有生物造成一點傷害,如果殺死了某個生物,則繼續自動重新使用該法術。只能主動使用一次,且必須最后使用。
請問,最多能消滅多少個怪物?褻瀆法術最多能釋放幾次?
輸入格式
第一行兩個整數 $n$ 和 $k$ ,表示怪物的數量和法術的傷害。第二行 $n$ 個正整數,依次表示每個怪物的生命值。
輸出格式
一行,兩個整數,表示最多能消滅多少怪物和褻瀆法術最多被釋放的次數。
數據范圍
對於 $40\%$ 的數據 $n \le 200$ 。
對於全部數據, $n, k \le 100000$, 怪物的生命上限為 $100000$。
樣例輸入
5 1 1 2 3 5 7
樣例輸出
4 5
#include<bits/stdc++.h> using namespace std; const int N=100010; int n,k,ans,mxn,a[N],c[N]; int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); c[a[i]]++; } int pos=0; while(1){ pos++; bool f=0; if(c[pos]>0){ c[pos]--; f=1; }else if(c[pos+k]>0){ c[pos+k]--; f=1; } if(!f) {pos--;break;} } for(int i=1;i<=n;++i) if(a[i]-k<=pos) mxn++; for(int i=1;i<=n;++i){ a[i]-=k; if(a[i]<=0) ans++; } for(int i=1;i<=n;++i) if(a[i]==1) ans++; printf("%d %d\n",max(ans,mxn),pos+1); return 0; }