可怕的戰爭發生了,小度作為后勤保障工作人員,也要為了保衛國家而努力。
現在有?N(1≤N≤)個堡壘需要補給,然而總的預算 B(1≤B≤
)是有限的。
現在已知第?i?個堡壘需要價值?P(i)?的補給,并且需要 S(i)?的運費。
鑒于小度與供應商之間長期穩定的合作關系,供應商慷慨地提供了一次特別的采購優惠。具體而言,小度可以選擇對某次補給進行半價采購。
這意味著,如果小度決定在向第?i?個堡壘提供補給時利用這一優惠,那么此次補給的采購及運輸總費用將減少至??P(i)/2?+S(i),其中優惠價格按照向下取整的原則計算。
對于其他堡壘?j,補給的采購和運輸費用則保持不變,即?P(j)+S(j)。
請計算小度的最多能給多少堡壘提供補給?
格式
輸入格式:
第1行2個整數:N 和 B 。(1≤N≤,1≤B≤
);
第2到 N+1 行:第 i+1 行包含兩個空格分隔的整數,P(i)和S(i)。(0≤P(i),S(i)≤)。
輸出格式:
1 行 1 個整數表示能提供補給的最大數。
樣例 1
輸入:
5 29 6 3 2 8 10 2 1 2 12 5
輸出:
4
貪心:
按照 p和s 的總和升序排序,剩余的預算不夠時,看是否滿足?剩余的預算>下一個堡壘的p/2,滿足則ans++
#include<bits/stdc++.h>
using namespace std;const int N = 1e3+10;
int n, b;
int ans;struct BL
{int p;int s;
}bl[N];bool cmp(BL x, BL y)
{return x.p+x.s < y.p+y.s;
}int main()
{cin>>n>>b;for(int i=1; i<=n; ++i) cin>>bl[i].p>>bl[i].s;sort(bl+1, bl+n, cmp);for(int i=1; i<=n; ++i){if(b > bl[i].p+bl[i].s){b -= bl[i].p+bl[i].s;ans++;}else if(b > bl[i].p/2+bl[i].s){b -= bl[i].p/2+bl[i].s;ans++;}else break;}cout<<ans<<endl;return 0;
}