亂搞+暴力+隊列優化——B(“1,2,3——4!”)

題目來源


Test On 1.17

出題人:PoPoqqq
2017 年 1 月 17 日


題目描述


“1,2,3——4!”
跳蚤國最近開始排隊型來迎接即將到來的跳蚤年啦,跳蚤國王站在主
席臺:“隊伍怎麼這麼不整齊??”
跳蚤們站成了一排,參差不齊。爲了足夠的整齊,國王要求,必須選
出一個當頭蚤站在最前面,隊伍中所有其他的跳蚤都必須是當頭蚤的身高
的整數倍,如果他的高度過於高,就必須學習縮骨功把自己壓縮到當頭蚤
的身高的整數倍。當然有些跳蚤比當頭蚤還矮……很不幸,他們不能再參
與這次排隊型活動。
我們定義一個隊形的和諧程度爲所有跳蚤的高度和,那麼最大的和諧
度是多少呢?跳蚤國王當然知道,但是他要考考你……


輸入


第一行一個數字 n, 表示一共有 n 個跳蚤。
接下來一行 n 個整數,分別表示 n 個跳蚤的身高。


輸出


一個數字,爲最大的和諧度。


樣例輸入


4
15 2 3 9


樣例輸出


27


樣例解釋


當然是選萌萌噠的第三號跳蚤作爲當頭蚤啦,捨棄第二隻跳蚤,剩下
兩隻跳蚤的身高都是第三隻的正數倍,能獲得的愉悅度是 15 + 3 + 9 = 27


數據規模與約定


對於40%的數據,有n<=1000
對於100%的數據,有n<=10e5, 每個跳蚤的身高<=2*10e5


思路


暴力:

最暴力的方法就是枚舉每一個跳蚤作爲當頭蚤時可獲得的和諧度取最大值作爲答案

優化:

當高度爲x與y(y>=x且y%x==0)同時存在時 以x爲當頭蚤時可獲得的和諧度必然不小於以y爲當頭蚤時可獲得的和諧度(可證,自行想象)

將高度由小到大排序 逐個嘗試加入隊列 若之前加入隊列的高度中有當前高度的因數 則當前高度不加入隊列中

最後只要枚舉將在隊列中的高度作爲當頭蚤高度時的情況即可


代碼(C++)


#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int n,hei[100010],x,m,ans=0;	bool w;
queue<int> q;
inline void miow();
inline void calc();
int main()
{
	scanf("%d",&n);	
	for(int i=1;i<=n;++i)
		scanf("%d",&hei[i]);
	sort(hei+1,hei+n+1);
	miow();
	calc();
	printf("%d",ans);
	return 0;
}
inline void calc()
{
	x=q.front();
	while(x!=0)
	{
		m=0;
		for(int i=1;i<=n;++i)
			m+=hei[i]-hei[i]%x;
		if(m>ans)
			ans=m;
		q.pop();
		x=q.front();
	}
	return ;
}
inline void miow()
{
	q.push(hei[1]);
	q.push(0);
	for(int i=2;i<=n;++i)
	{
		w=1;	
		x=q.front();
		while(x!=0)
		{
			if(hei[i]%x==0)
				w=0;
			q.pop();
			q.push(x);
			x=q.front();
		}
		q.pop();
		if(w==1)
			q.push(hei[i]);
		q.push(0);
	}
}


發佈了57 篇原創文章 · 獲贊 39 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章