1. 程式人生 > >CodeForces 140C 貪心+優先佇列

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; 
}