• HrbustOJ 1176 小陈老师、雪人 (STL map 和优先队列)


    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1176

    水了一道比较有意思的题目。

    其实就是给了很多的数。问最多可以搭配出多少种三个不同的数的组合,并且输出。

    第1行,包含一个整数n(1≤n≤100000) — 雪球的数量。
    第2行,包含n个整数 — 雪球的半径r1, r2, ..., rn (1≤ri≤1000000000)

    给的数比较多,也比较大,所以用map 来存。map 来记录个数。

    然后用优先队列。把各个数的个数入队列。先取个数最多的三个数,个数减一后要再入队。

    直到队列为空。

    map 和优先队列不熟悉啊,写的比较纠结:

    代码:

    #include<stdio.h>
    #include<map>
    #include<queue>
    #include<algorithm>
    using namespace std;

    struct node
    {
    int x;//值·
    int y;//数量
    friend bool operator<(node a,node b)
    {
    return a.y < b.y;
    }
    };
    map<int,int>p;
    priority_queue<node>q;

    int a[100010];
    int bb[100000][3];
    int main()
    {
    int n;
    int res;
    node tmp;
    while(scanf("%d",&n)!=EOF)
    {
    p.clear();
    for(int i=0;i<n;i++)
    {
    scanf("%d",&a[i]);
    p[a[i]]++;
    }
    while(!q.empty()) q.pop();
    for(int i=0;i<n;i++)
    {
    if(p[a[i]]!=0)
    {
    tmp.x=a[i];
    tmp.y=p[a[i]];
    q.push(tmp);
    p[a[i]]=0;
    }
    }
    res=0;
    int a1,a2,a3;
    node tmp1,tmp2,tmp3;
    while(!q.empty())
    {
    tmp1=q.top();
    q.pop();
    a1=tmp1.x;
    tmp1.y--;
    if(q.empty()) break;

    tmp2=q.top();
    q.pop();
    a2=tmp2.x;
    tmp2.y--;
    if(q.empty()) break;

    tmp3=q.top();
    q.pop();
    a3=tmp3.x;
    tmp3.y--;

    if(tmp1.y>0)q.push(tmp1);
    if(tmp2.y>0)q.push(tmp2);
    if(tmp3.y>0)q.push(tmp3);

    if(a1<a2)
    {
    int m=a1;
    a1=a2;
    a2=m;
    }
    if(a2<a3)
    {
    int m=a2;
    a2=a3;
    a3=m;
    }
    if(a1<a2)
    {
    int m=a1;
    a1=a2;
    a2=m;
    }
    bb[res][0]=a1;
    bb[res][1]=a2;
    bb[res++][2]=a3;
    }
    printf("%d\n",res);
    for(int i=0;i<res;i++)
    {
    printf("%d %d %d\n",bb[i][0],bb[i][1],bb[i][2]);
    }


    }
    return 0;
    }

    题目如下:

    小陈老师、雪人
    Time Limit: 1000 MS Memory Limit: 65536 K
    Total Submit: 47(15 users) Total Accepted: 14(7 users) Special Judge: Yes
    Description
    东北的冬季,尤其是过年的时候,小陈老师喜欢去堆雪人。
    每个雪人主要由三个雪球构成:大雪球、中雪球、小雪球。
    他已经准备好了N个雪球,半径分别等于r1, r2, ..., rn。如果要堆一个雪人,就需要三个半径互不相等的雪球。
    例如:
    三个雪球的半径为1、2、3,能够用来堆一个雪人。但是半径为2、2、3或者2、2、2的三个雪球就不可以。
    快帮帮小陈老师,算算他最多能用这些雪球堆多少个雪人。
    Input
    对于每组测试数据:
    第1行,包含一个整数n(1≤n≤100000) — 雪球的数量。
    第2行,包含n个整数 — 雪球的半径r1, r2, ..., rn (1≤ri≤1000000000)。
    处理到文件结束
    Output
    对于每组测试数据:
    第1行,输出最多能堆多少雪人 - k。
    接下来k行,每行描述一个雪人,每行用空格分割三个数字分别表示大雪球、中雪球、小雪球的半径。
    可以用任何顺序输出每个雪人。如果有多种可行解,输出任意一个即可。
    Sample Input
    7
    1 2 3 4 5 6 7
    3
    2 2 3
    Sample Output
    2
    3 2 1
    6 5 4
    0
    Author
    齐达拉图
  • 相关阅读:
    21.Merge Two Sorted Lists 、23. Merge k Sorted Lists
    34. Find First and Last Position of Element in Sorted Array
    leetcode 20. Valid Parentheses 、32. Longest Valid Parentheses 、301. Remove Invalid Parentheses
    31. Next Permutation
    17. Letter Combinations of a Phone Number
    android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
    oc 异常处理
    oc 类型判断
    oc Delegate
    oc 协议
  • 原文地址:https://www.cnblogs.com/kuangbin/p/2396059.html
Copyright © 2020-2023  润新知