Determine how the array will look after described operations are performed.For example, consider the given array looks like [3,4,1,2,2,1,1].
It will be changed in the following way: [3,4,1,2,2,1,1] → [3,4,2,2,2,1] → [3,4,4,2,1] → [3,8,2,1].If the given array is look like [1,1,3,1,1],it will be changed in the following way: [1,1,3,1,1] → [2,3,1,1] → [2,3,2] → [3,4].
The first line contains a single integer n(2≤n≤150000) — the number of elements in the array.
The second line contains a sequence from nelements a1,a2,…,an (1≤ai≤109) — the elements of the array.
In the first line print an integer k— the number of elements in the array after all the performed operations. In the second line print k integers — the elements of the array after all the performed operations.
7 3 4 1 2 2 1 1
4 3 8 2 1
5 1 1 3 1 1
2 3 4
5 10 40 20 50 30
5 10 40 20 50 30
The first two examples were considered in the statement.
In the third example all integers in the given array are distinct, so it will not change.
题意:给你n个数,然后如果同一个数出现过两次或者多次的话,就把两个数求和,并放在两个数的右边。然后问你最终的那个数列的顺序。
解题思路:
一开始看这个题目的时候,我的第一反应就是优先队列,因为最近刚结束的团队天梯赛里就有一道这样的题,只是稍微变形了求法。
我们把每一个输入的元素加入下标,如果两个数相等,那么就优先输出最开始输入的那两个,如果两个数不相等,那么就把最小的那个先记录下来,然后把另一个压回到优先队列中。因为有可能组成另一个稍微大点的值。然后就是两个数合并过程和输出记录过程。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=3e5+10;
typedef struct Node{
long long sum,pos;
bool operator < (const Node &a) const {
if(a.sum==sum)
return a.pos<pos;
return a.sum<sum;
}
}node;
struct query{
long long sum,pos;
}edge[maxn];
priority_queue<node> qu;
bool cmp(query a,query b){
return a.pos<b.pos;
}
long long num,n;
int main(){
int i,j;
scanf("%I64d",&n);
node no,po;
while(!qu.empty()) qu.pop();
for(i=1;i<=n;i++){
scanf("%I64d",&num);
no.pos=i;no.sum=num;
qu.push(no);
}
long long tot=0;
while(!qu.empty()){
if(qu.size()==1){
no=qu.top();qu.pop();
edge[tot].sum=no.sum;
edge[tot++].pos=no.pos;
break;
}
no=qu.top();qu.pop();
po=qu.top(); qu.pop();
if(no.sum==po.sum){
no.sum*=2;
no.pos=max(no.pos,po.pos);
qu.push(no);
}
else{
edge[tot].sum=no.sum;
edge[tot++].pos=no.pos;
qu.push(po);
}
}
sort(edge,edge+tot,cmp);
printf("%I64d\n",tot);
for(i=0;i<tot;i++){
printf("%I64d",edge[i].sum);
if(i!=tot-1)
printf(" ");
}
printf("\n");
return 0;
}
哎,过了D题也掉分,ORZ。难受。