Codeforces140C

题意:

给你 n 个数,问你最多能从里面取几组3个不同的数。

思路:

把数组元素计数,然后每次拿个数最多的3个数组合,用优 先队列每次取大即可。

但是 1<=ri<=1e9 ,不能开那么大的数组存啊,用STL中的 map 的话可能没问题,但是时间复杂度会大。

这里采用离 散化。就是先把数组元素排序,然后原来位置的元素用其排 序好的位置代表。

#include
using namespace std;
typedef long long LL;
const int N=1e5+10;
struct Node{
    int num;
    int w;
    bool operator <(const Node &a) const
    {
        return a.num>num;
    }
};
priority_queueq;

struct asd
{
    int s,m,t;
} ans[N];
int n,num[N];
paira[N];
bool flag[N];
vectorxs;

void Li_San_Hua()
{
    Node temp;
    sort(xs.begin(),xs.end());
    vector::iterator e;
    e=unique(xs.begin(),xs.end());
    for(int i=0; i=3)
    {
        ind1 = q.top();q.pop();ind1.num--;
        ind2 = q.top();q.pop();ind2.num--;
        ind3 = q.top();q.pop();ind3.num--;
        f[0]=ind1.w;
        f[1]=ind2.w;
        f[2]=ind3.w;
        sort(f,f+3);
        ans[res].s = f[0];
        ans[res].m = f[1];
        ans[res++].t = f[2];
        if(ind1.num) q.push(ind1);
        if(ind2.num) q.push(ind2);
        if(ind3.num) q.push(ind3);
    }
    return res;
}

int main()
{
    int num;
    scanf("%d",&n);
    for(int i=0; i




你可能感兴趣的:(codeforces,贪心)