CodeForces 140C 貪心+優先佇列
Output
0
思路:我們要堆更多的雪人而且三種雪球的大小不能相等,基於貪心的思想,我們要優先用完雪球數量多的雪球,
舉個例子: 2 2 2 3 3 如果先使用數量小的,那麼一會就沒了 只能做兩個,如果使用數量多的,那麼堆得要比兩個多;
這裡我們根據每種雪球的數量進行從大到小的優先佇列,然後用map儲存的對應每個大小雪球的數量,每次優先去三個數量最多且大小不同的雪球,並對他們按照從大到小排序存入ans陣列最後輸出結果,如果取出對應半徑的雪球后數量還不為0,那麼繼續入隊;知道佇列為空 或者不夠三個了;
傳送門:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<algorithm>
#define N 100010
using namespace std;
int n;
int r[N];
int sum[N][4];
struct node
{
friend bool operator <(node x,node y)
{ return x.num<y.num;
}
int num;
int d;
}p[N];
int main()
{
int i,j;
scanf("%d",&n);
priority_queue<node>Q;
map <int,int> q;
for(i=1;i<=n;i++)
{ scanf("%d",&r[i]);
q[r[i]]++;
//printf("%d\n",q[r[i]]);
}
int k=0;
for(i=1;i<=n;i++)
{ if(q[r[i]]!=0)
{ p[k].d=r[i];
//printf("%d\n",p[k].d);
p[k].num=q[r[i]];
Q.push(p[k]);
k++;
q[r[i]]=0;
}
}
k=0;
node a,b,c;
int f[3];
while(!Q.empty())
{ a=Q.top();
//printf("%d\n",a.d);
f[0]=a.d;
Q.pop();
a.num--;
if(Q.empty())//前兩次沒取出top就要判斷是否為空,(每個雪球大小不等),若為空則不能堆出雪人;
break;
b=Q.top();
f[1]=b.d;
Q.pop();
b.num--;
if(Q.empty())
break;
c=Q.top();
f[2]=c.d;
Q.pop();
c.num--;
sort(f,f+3);
//printf("%d %d %d",f[2],f[1],f[0]);
sum[k][0]=f[2];
sum[k][1]=f[1];
sum[k][2]=f[0];
k++;
if(a.num>0)
Q.push(a);
if(b.num>0)
Q.push(b);
if(c.num>0)
Q.push(c);
}
printf("%d\n",k);
for(i=0;i<k;i++)
printf("%d %d %d\n",sum[i][0],sum[i][1],sum[i][2]);
return 0;
}