zoukankan      html  css  js  c++  java
  • CodeForces #100 C 贪心+STL

    题目链接:CodeForces #100  C

    题意:现在给出n个snowball的半径,3个半径严格递增或递减的snowball,可以组成1个snowmen。问最多能组成多少个snowmen。并且按照半径递减的顺序输出每个snowmen的组成。

    思路:嗯...每次都从前三个个数最多的snowball里选择,最后组成的snowmen最多...

    ...可以用优先队列写..但是感觉set+map写的太优雅了...map当然不等于数组了...哼。

    #include <stdio.h>
    #include <iostream>
    #include <set>
    #include <map>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    typedef pair<int, int> pair_;
    map<int, int> mp;
    set<pair_> st;
    vector<int> ans;
    
    int main() {
        //freopen("in.cpp", "r", stdin);
        int n;
        while(~scanf("%d", &n)) {
           mp.clear();
           st.clear();
           ans.clear();
           int temp;
           for (int i=0; i<n; ++i) {
                scanf("%d", &temp);
                mp[temp]++;
           }
           map<int, int>::iterator mpit;
           for (mpit = mp.begin(); mpit != mp.end(); ++mpit) {
                //st.insert(pair_((*mpit).second, (*mpit).first));
                st.insert(pair_(mpit->second, mpit->first));
           }
           while(st.size() >= 3) {
            pair_ now[3];
            for (int i=0; i<3; ++i) {
                now[i] = *--st.end();
                st.erase(--st.end());
                ans.push_back(now[i].second);
            }
            for (int i=0; i<3; ++i) {
                if (--now[i].first) st.insert(now[i]);
            }
            sort(ans.rbegin(),ans.rbegin()+3);
           }
           printf("%d
    ", ans.size()/3);
           for (int i=0; i<ans.size(); i+=3) {
            printf("%d %d %d
    ", ans[i], ans[i+1], ans[i+2]);
           }
        }
        return 0;
    }
    
  • 相关阅读:
    建立文件结构
    PCL类的设计结构
    如何编写新的PCL类
    PCL推荐的命名规范(2)
    PCL推荐的命名规范(1)
    PCL中异常处理机制
    如何增加新的PointT类型
    hdoj 1728 逃离迷宫
    ny710 外星人的供给站
    ny714 Card Trick
  • 原文地址:https://www.cnblogs.com/icode-girl/p/5785076.html
Copyright © 2011-2022 走看看