首页 > 其他分享 >P1090 [NOI洛谷P2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G

P1090 [NOI洛谷P2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G

时间:2023-11-27 23:31:49浏览次数:30  
标签:Repair 排序 洛谷 NOI int sum long 队列 include

可以用堆来实现,或者更简单一点的优先队列

优先队列:

#include<queue>
priority_queue<int,vector<int>,greater<int> > q;

因为每次合并后,最小的两个值都会更新,所以可以很好的利用优先队列内元素有序的特点,减少因反复排序带来的时间复杂度;

一开始我用STL自带的排序sort,报了5个TLE,后来意识到sort的实现主要依赖于快速排序,而每次合并后,真正需要排序的元素只有一个,快速排序有点大材小用,所以这可能是爆时限的原因,但后来也没有尝试自己实现一个排序算法,改用优先队列实现,直接AC,很好的利用了优先队列中元素有序的特点。

下面是代码实现:

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<fstream>
using namespace std;
bool compare(long long int x,long long int y) {
	return x < y ? true : false;
}
long long int n, s, i, sum;
int element;

vector<long long int> ans;
priority_queue<long long int, vector<long long int>, greater<long long int> >q;
int main(void) {
	cin >> n;
	ans.reserve(n);
	for (i = 0; i < n; i++) {
		cin >> element;
		q.emplace(element);
	}
	while (q.size()!=1) {
		sum = q.top();
		q.pop();
		sum += q.top();//因为优先队列无法访问指定下标元素,所以我选择先加一个,再删掉后再加上去
		ans.push_back(sum);//然后将答案存入数组中,作为一次合并数据
		q.pop();
		q.emplace(sum);//随后直接插入合并后的数据,利用优先队列的特点,再次排序
	}
	for (int i = 0; i < n - 1; i++) {
		s += ans[i];
	}
	cout << s;
	return 0;
}

标签:Repair,排序,洛谷,NOI,int,sum,long,队列,include
From: https://blog.51cto.com/u_16271511/8589558

相关文章

  • NOIP2023 双序列拓展
    洛谷传送门首先\(x_1=y_1\)显然不合法。若\(x_1>y_1\)就把\(x,y\)全部取相反数,这样就只用考虑\(x_1<y_1\)的情况了。然后考虑一个\(O(nmq)\)的dp,设\(f_{i,j}\)为拓展\(X\)的前\(i\)个元素和\(Y\)的前\(j\)个元素是否可行。那么若\(x_i<y_j\)则......
  • NOIP2023 游记
    Day0打摆。打摆。打摆。看tarjan。打摆。打摆。打摆。Day1早上很早到了附中,发现准考证上没有照片,黑糊糊一片,被教练强行紧急更换了一个,感觉不换其实也没什么关系。进考场,发现在最后一排,旁边不认识,前面不认识,前面的旁边不认识,sad。然后发密码,开T1,发现会了,15min写完......
  • P1970 [NOIP2013 提高组] 花匠
    显然只选峰或者谷,所以记录当前走势是向上还是向下,出现转折时答案加一即可。因为存在相同的元素,所以开头的走势要特判,把最前面连续相同的一段看成一个元素,因为不确定会转变成哪种走势。后面遇到相同则可以正常做,因为前面走势已经确定了,相当于自动忽略了相同的元素。......
  • 洛谷P5719 分类平均
    intmain(){ intn,k,add=0,abb=0; doublesum=0,cnt=0; cin>>n>>k; for(inti=1;i<=n;++i) if(i%k==0) { add++; sum+=i; } cout<<fixed<<setprecision(1)<<sum/add<<''; for(inti=1;i<=n;++i) if(i%k......
  • 堆和优先队列(洛谷P3378)
    1.优先队列解决:优先队列:头文件和定义:#include<queue>template<classT,classContainer=vector<T>,classCompare=less<typenameContainer::value_type>>classpriority_queue;可表达为以下形式:priority_queue<Type,Container,Functional>type:即数据的类型Co......
  • P1090 [NOIP2004 提高组] 合并果子
    原题链接题解每次从所有果子堆中选重量最小的两堆并累加,观察到只需要找出最小因此考虑用堆代码#include<bits/stdc++.h>usingnamespacestd;intpile[10005]={0};intlen=0;voidin(intx){pile[++len]=x;intnow=len;while(pile[now]<pile[now/2]......
  • NOIP 历年真题 贪心
    数据范围较小时,可以考虑dp。设\(f(i,j)\)表示当前段末尾为\(i\),上一段末尾为\(j\)的最小代价。转移为:\[f(i,j)=\min_{s_i-s_j\ges_j-s_k}f(j,k)+(s_i-s_j)^2\]时间复杂度\(O(n^3)\)。不难想到一个性质:要使得\(f(i,j)\)最小,上一段末尾\(j\)要尽可能靠后。这样就......
  • NOIP 2023 游记
    在长郡考试,爽!开场开T1,码上去发现大样例挂了,然后发现题看错了,然后过了五十分钟才过T1大样例。开T2感觉像是建图,建了半天啥都没建出来(没观察样例的后果),此时想了半个多小时了,感觉得跑路了,打了\(40\)跑路。(\(60\)分不知道为啥挂了)开T3感觉暴力都不会,自闭了,然后开T4,然后......
  • 86th 2023/11/18 NOIP Day1
    已经过去了,总结得写赛前没什么,直接入题T1一眼了,T2看了看,手模了一下,觉得非常麻烦,难以处理T3看一眼认为不太能做,后来还剩0.5h时开了它,发现可以拿分T4看出了暴力,发现有一当应该是DP的部分分然后去推T2,然后很自信地认为,按它特殊数据给的数量,可以拿80分然后20min切了T1后,开始码T2......
  • 85th 2023/11/17 NOIP Day0
    明天就要在楼下的考场打了老师今天给了一整天的自主做题时间,初中生是做题,而高中就是复习了话不多说直接来到今天的归纳:斜率优化,要敢于把i,j移动至转移方程的左右,最后归纳为一次函数的形式,并观察需要去最值的东西,凸包似乎挺好维护关于区间:包含,相交,不相交,三种要考虑全,如:[P5464......