題意:給出n個產品的重量w和價值v,給定m個區間,每個區間通過乙個包含引數w的式子來計算,使總的值逐漸逼近乙個值s
分析:很明顯w為0時,所有產品都滿足,此時y最大,當w比重量w的最大值還大時,所有產品都不滿足,此時y最小,可以明顯看出單調性,我們可以採用二分的方法來做
二分的話如果每次判斷的話都是乙個乙個區間的求,時間複雜度為o(n*m),我們得用字首和將之優化為o(n)
對於每乙個w,進行字首和的時候,如果對應的重量w比w大,則sum陣列加上當前數,否則則不加。
另外,題目是要讓我們盡可能的靠近標準值,所以二分的時候要另外用乙個數ans來記錄
這裡介紹乙個絕對值函式:llabs()能夠求ll數的絕對值。
#includeusingnamespace
std;
typedef
long
long
ll;const
int mod=1e9+7
;const
int maxn=2e5+7
;const ll inf=1e18+7
;const
double pi=acos(-1
);ll ans=inf,res=inf;
ll n,m,s;
ll sum[maxn],sum_n[maxn],w[maxn],v[maxn],l[maxn],r[maxn];
bool isok(int
x)
for(int i=0;i)
//cout
//couty)return
false
;
else
return
true;}
intmain()
for(int i=0;i)
int left=mn-1,right=mx+2;//
右邊界如果只取到mx,則包含不了所有礦石都不滿足的情況,mn同理
while(left<=right)
cout
return0;
}
二分 字首和 聰明的質檢員
問題 f noip2011提 聰明的質監員 day 2 時間限制 1 sec 記憶體限制 128 mb 53 解決 9 提交 狀態 討論版 題目描述 小t是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n個礦石,從1到n逐一編號,每個礦石都有自己的重量wi以及價值vi。檢驗礦產的流程是 1...
洛谷 P1314 聰明的質檢員
原題 小t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 nn 個礦石,從 11到nn 逐一編號,每個礦石都有自己的重量wi 以及價值vi 檢驗礦產的流程是 1 給m個區間 li ri 2 選出乙個引數 w 3 對於乙個區間 li ri 計算礦石在這個區間上的檢驗值yi 這批礦產的檢驗...
NOIP 2011 聰明的質檢員 二分答案
先解釋一下這個式子 就是說如果區間 li,ri 中 wj w的個數 乘以 所有的wj w的價值的和。那麼我們可以二分w的值,通過y與s的值來調整w,具體來講,只要當下的y大於s,那麼增加mid 增大mid質量 否則減小mid。至於check,我們可以o n 的預處理字首和 and 字首積。總複雜度 ...