洛谷P1090 传送门
这两天没刷题(忙着上王者),晚上洗完澡准备去切洛谷,然后刚刷一题就被卡住了。先上题(上面有原题链接):
第一次,我很**的sort之后直接加,然后只过了样例。。。
第二次,我(明知会TLE)每次sort然后加上最小的两个数,然后TLE 50%
然后看了一下题解,第一篇是 堆?,然后又看了第二篇,发现是很简单的优先队列。(原来洛谷每道题都有标签。。)
ps:优先队列之前看过好几次,不过还没具体用过,总之应该就是压入元素的时候会自动排序
然后自己很快也写好了
int main()
{
priority_queue<ll> p;
int n;
cin >> n;
ll ans = 0;
while (n--)
{
ll a;
cin >> a;
p.push(a);
}
while (p.size() >= 2)
{
ll temp = 0;
ll a;
a = p.top();
ans += a;
temp += a;
p.pop();
a = p.top();
ans += a;
temp += a;
p.pop();
p.push(temp);
}
cout << ans << endl;
return 0;
}
不过写完之后才发现优先队列默认是降序排序的,而这题需要升序排序。。。。然后又去看了一下题解,好像是需要重载运算符
,由于今天太晚了所以就只好(被迫)Ctrl+C+V
了。
int main()
{
priority_queue<ll, vector<ll>, greater<ll> > p;
//Ctrl CV(逃~
// priority_queue<ll> p; //我第一次写的
int n;
cin >> n;
ll ans = 0;
while (n--)
{
ll a;
cin >> a;
p.push(a);
}
while (p.size() >= 2)
{
ll temp = 0;
ll a;
a = p.top();
ans += a;
temp += a;
p.pop();
a = p.top();
ans += a;
temp += a;
p.pop();
p.push(temp);
}
cout << ans << endl;
return 0;
}
另外,今天上王者了,明天应该能刷点洛谷(小声