题目链接:https://vjudge.net/contest/376896#problem/D
题意:给出n个数,询问能排出多少个长度为三的纯单调序列,顺序可以打乱,一个数只可以用一次
阶梯思路:
先用map函数记录每个数出现的次数,然后遍历map数组,将各个数对应的个数 放入优先队列中,优先队列按数量从大到小排序,即数量大的数先选择。然后用a、b、c数组分别保存在三个数,k保存数量
注意map函数遍历的方法,大的数值统计个数时候很实用
it->first 是坐标i,it->second是map[i]

for(auto it =m.begin();it!=m.end();it++){q.push(P(it->second,it->first));}

注意

/*int x=q1.first; int y=q2.first; int z=q3.first;x-=z; y-=z;while(z--){a[k]=q1.second;b[k]=q2.second;c[k++]=q3.second;}if(x>0){q1.first=x;q.push(q1);}if(y>0){q2.first=y;q.push(q2);}*/q1.first--;q2.first--;q3.first--;a[k]=q1.second;b[k]=q2.second;c[k++]=q3.second;if(q1.first>0) q.push(q1);if(q2.first>0) q.push(q2);if(q3.first>0) q.push(q3);

注释里的方法是错误的,不可以一次把所有大的全部取出。
以 11 22 3 4 5为例,如果先把345选用那么会浪费很多组,不如 1 2 3 、1 2 4来的多
再以 111 222 333 44 55 为例,如果按注释的方法先把111 222 333 全部取出,那么44 55 就浪费了,而当我们先去 11 22 33 时,剩下来 44 55 1 2 3按照 1 4 5、 2 4 5的方法来取,得到的方案数更多

#include<iostream>
#include<queue>
#include<cstdio>
#include<string.h>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
typedef pair<int,int> P;
struct cmp{bool operator ()(P a,P b){return (a.first==b.first)?(a.second<b.second):(a.first<b.first);}
};
int n;
int r[110000];
int a[110000],b[110000],c[110000];
map<int,int> m;
priority_queue<P,vector<P>,cmp> q;
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&r[i]);m[r[i]]++;}for(auto it =m.begin();it!=m.end();it++){q.push(P(it->second,it->first));}int k=0;while(q.size()>=3){P q1=q.top(); q.pop();P q2=q.top(); q.pop();P q3=q.top(); q.pop();/*int x=q1.first; int y=q2.first; int z=q3.first;x-=z; y-=z;while(z--){a[k]=q1.second;b[k]=q2.second;c[k++]=q3.second;}if(x>0){q1.first=x;q.push(q1);}if(y>0){q2.first=y;q.push(q2);}*/q1.first--;q2.first--;q3.first--;a[k]=q1.second;b[k]=q2.second;c[k++]=q3.second;if(q1.first>0) q.push(q1);if(q2.first>0) q.push(q2);if(q3.first>0) q.push(q3);}printf("%d\n",k);for(int i=0;i<k;i++){if(a[i]<b[i]){int tmp=a[i];a[i]=b[i];b[i]=tmp;}if(a[i]<c[i]){ int tmp=a[i];a[i]=c[i];c[i]=tmp;}if(b[i]<c[i]){int tmp=b[i];b[i]=c[i];c[i]=tmp;}printf("%d %d %d\n",a[i],b[i],c[i]);}return 0;
}

CF140C.New Year Snowmen(优先队列+map)相关推荐

  1. CF140C New Year Snowmen(贪心+优先队列)

    CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...

  2. 一份自己整理的不太详细的常见面试题

    1.java基础 1.解释下什么是面向对象?面向对象和面向过程的区别? ​ 面向对象是一种基于面向过程的编程思想,是面向现实世界模型的自然延申,这是一种"万物皆对象"的编程思想.由 ...

  3. 【机试】2011-2020年复旦大学考研复试机试真题

    题型分布目录 一.DP问题 [2011-1]DP-最长公共子序列LCS [2014-2]DP-字符串的编辑距离 [2014-4]DP-Hanoi 塔 [2016-1]DP-求最大连续公共字串长度 [2 ...

  4. L3-1 千手观音【拓扑排序】

    人类喜欢用 10 进制,大概是因为人类有一双手 10 根手指用于计数.于是在千手观音的世界里,数字都是 10 000 进制的,因为每位观音有 1 000 双手 -- 千手观音们的每一根手指都对应一个符 ...

  5. New Year Snowmen((贪心)map+优先队列)

    文章目录 一.题目 二.解题步骤 1.题意 2.思路 Source Program 一.题目 New Year Snowmen:传送门 Examples Input 7 1 2 3 4 5 6 7 O ...

  6. 贪心(优先队列) - New Year Snowmen - CodeForces - 140C

    贪心(优先队列) - New Year Snowmen - CodeForces - 140C 题意: 给定一个长度为n的正整数序列a1,a2,...,an.给定一个长度为n的正整数序列a_1,a_2 ...

  7. CF140C-New Year Snowmen【优先队列】

    正题 题目链接:https://www.luogu.com.cn/problem/CF140C 题目大意 nnn个雪球,一个雪人需要用333个不同大小的雪球堆起,求最多雪人. 解题思路 我们每次拿相同 ...

  8. LeetCode 1086. 前五科的均分(map + 优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个不同学生的分数列表,请按 学生的 id 顺序 返回每个学生 最高的五科 成绩的 平均分. 对于每条 items[i] 记录, items[i][0 ...

  9. LeetCode 451. 根据字符出现频率排序(map+优先队列)

    1. 题目 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 输入: "tree"输出: "eert" 2. 优先队列解题 先用map统计字符出现次数 ...

最新文章

  1. Java多态性Polymorphic
  2. 美国科技界高度关注中国科技创新进展
  3. c语言题库杭电,C语言杭电18级B卷试题答案.doc
  4. 子线程适当Sleep的重要性
  5. Go的channel与map是否并发安全以及原因
  6. 使用SSH密钥对给你的阿里云ECS加把安全锁
  7. php同时上传多个数据,怎样一次上传多个数据流
  8. java 常量变量使用_java常量和变量入门教程
  9. java运算符 —(5)
  10. 面向对象软件设计原则
  11. 微信小程序最全Tab选项卡,你要的功能都在这里啦
  12. “三只松鼠”为何一天能卖一亿元
  13. pyodbc linux 乱码,python-无法在Linux上安装pyodbc
  14. 操作系统from清华大学向勇,陈渝 笔记(一)绪论
  15. Android自动化测试之Monkey
  16. Kernel那些事儿之内存管理(6) --- 衣带渐宽终不悔(下)
  17. 笔记本双网卡带宽叠加上网
  18. Unity3D实现3D立体游戏原理及过程
  19. 做ARM的一些前后经历——转载的
  20. 【python】python代码加密与License控制

热门文章

  1. tp5.1 系统常量
  2. CISCO WLC的配置备份与导入
  3. 17 RFID卡的读写
  4. 北京冬奥会 向世界展示了什么
  5. cisco ASA ios升级或恢复
  6. 需要一个自习室系统,包括收费、灯控、会员管理、微信及前端订座、一卡通终端,会做的私信我,有偿。
  7. django实现证件照换底色后端和小程序(第三周学习记录)
  8. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:Mega + ESP8266 + MQ2烟雾传感器 + MQ3酒精传感器 + MQ7一氧化碳传感器 + OLED +巴法云平台
  9. PMBOK(第4版)--项目管理九大知识领域的【输入】、【工具与技术】、【输出】一览表
  10. 房地产类软件实战教程,如何写好房地产类软文