标签:mes begin amp const auto fine make algorithm 下标
思路:两个相等的数相加得到的数一定是没有经过处理的,所以记录每个数出现的下标,然后从小到大枚举,处理每个数就可以。
关键是用stl来组织数据。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<string> #include<vector> #include<map> #include<queue> #include<functional> #define DEBUG(x) cout<<#x<<" = "<<x<<endl typedef long long ll; using namespace std; map<ll,priority_queue<int,vector<int>,greater<int> > >mp; map<ll,priority_queue<int,vector<int>,greater<int> > >::iterator itr; vector<pair<int,ll> >v; bool cmp(const pair<int,ll> &pa,const pair<int,ll> &pb) { return pa.first<pb.first; } int main() { // freopen("in.txt","r",stdin); int n; scanf("%d",&n); for(int i=0;i<n ;i++ ){ ll t; scanf("%I64d",&t); mp[t].push(i); } for(itr=mp.begin();itr!=mp.end() ;itr++ ){ ll t=itr->first; auto &pq=itr->second; ///合并两个相等的数,直到数量小于2 while(pq.size()>=2){ int i1=pq.top(); pq.pop(); int i2=pq.top(); pq.pop(); i1=max(i1,i2); mp[2*t].push(i1); } } for(auto p:mp){ auto &pq=p.second; ll t=p.first; if(pq.size()==1)v.push_back(make_pair(pq.top(),t)); } sort(v.begin(),v.end(),cmp); printf("%d\n",v.size()); for(int i=0;i<v.size() ;i++ ){ printf("%d ",v[i].second); } }
标签:mes begin amp const auto fine make algorithm 下标
原文地址:https://www.cnblogs.com/MalcolmMeng/p/9749812.html