1. 程式人生 > 其它 >P2234 營業額統計 題解

P2234 營業額統計 題解

對於這種題目,我們考慮使用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}{φ}\)