P2234 營業額統計 題解
阿新 • • 發佈:2022-03-14
對於這種題目,我們考慮使用STL大法。
我們先插入兩個哨兵,以防不會用越界。.begin()
和.end()
這裡把哨兵的值設定為了\(\pm 1 \times 10^7\)。
然後,邊讀入邊判斷。
如果這個數已經有過了,那麼就直接+0就可以了。
如果這個數還沒有出現過,那麼將其加入set內,並查詢其前驅與後繼。
之後,取其與其前驅與後繼值之差的較小值,並加入總和之中。
當然,如果其前驅與後繼均為哨兵,那麼就代表這個數是第一個,直接輸出這個值。
程式碼如下:
#include<bits/stdc++.h> using namespace std; int tot = 0; set<int>his;//歷史記錄 set<int>::iterator it; int n; int main() { scanf("%d", &n); his.insert(-1000000), his.insert(1000000);//插入哨兵 for(int i = 1; i <= n; i++) { int k; scanf("%d", &k); if(his.count(k))continue;//這個數出現過,直接跳過後續判斷 his.insert(k); int minn = 200020; it = his.find(k); it++; minn = min(minn, abs(*it - k));//這個數與其前驅之差 it--, it--; minn = min(minn, abs(*it - k));//這個數與其後繼之差 tot += (minn>200000?k:minn);//是否為第一個數 } printf("%lld\n", tot); return 0; }
\(\color[rgb]{1,1,0.0625}{φ}\)