CodeForces - 730A 贪心+模拟
贪心策略:
1、只有一个最大值,选着第二大的一起参加比赛减分。
2、有奇数个最大值,选择三个进行比赛。
3、偶数个最大值,选择两个进行比赛。
为什么不把最大值全部选择?
因为最多只能选五个,有可能选择完五个只剩下一个最大值,那么就会进行贪心策略1,会出错。
AC代码:
#include<cstdio> #include<set> using namespace std; const int maxn=1e4+1; char ans[maxn][101]; int cnt=0,n; struct node{ int ind; int val; node(){} node(int i,int v):ind(i),val(v){} bool operator < (const node &p)const{ return val>p.val; } }score[105]; multiset<node>ss; typedef multiset<node>::iterator iter; inline int counter(){ //相同最大值的个数 int key=(ss.begin())->val; int cntt=0; for(iter c=ss.begin();c!=ss.end();++c){ if(c->val==key) ++cntt; else break; } return cntt; } inline void deal(int k,int *a){ for(int i=0;i<k;++i){ if(score[a[i]].val>0) score[a[i]].val-=1; ss.insert(score[a[i]]); } for(int i=0;i<n;++i){ int ok=0; for(int j=0;j<k;++j) if(a[j]==i) {ok=1;break;} if(ok) ans[cnt][i]='1'; else ans[cnt][i]='0'; } cnt++; } //模拟 void solve(){ int cnt=counter(); if(cnt==n) return; int k=0,a[5]; if(cnt==1||cnt%2==0) { iter c=ss.begin(); a[k++]=c->ind; ss.erase(c); c=ss.begin(); a[k++]=c->ind; ss.erase(c); deal(k,a); } else if(cnt>1&&cnt&1){ iter c=ss.begin(); a[k++]=c->ind; ss.erase(c); c=ss.begin(); a[k++]=c->ind; ss.erase(c); c=ss.begin(); a[k++]=c->ind; ss.erase(c); deal(k,a); } solve(); } int main(){ scanf("%d",&n); for(int i=0;i<n;++i){ scanf("%d",&score[i].val); score[i].ind=i; ss.insert(score[i]); } solve(); printf("%d\n",(ss.begin())->val); printf("%d\n",cnt); for(int i=0;i<cnt;++i) printf("%s\n",ans[i]); return 0; }
昨晚我又想了下,其实还有一种直观贪心:
1、只有一个最大值,选择最大和第二大进行比赛。
2、如果有6个最大值,选择4个比赛。不能选5个,因为一定要把所有最大值同时处理掉。
3、如果最大值大于6,选择5个比赛。
4、其他大于1小于等于5的情况,就全部选择参加比赛
AC代码:
#include<cstdio> #include<set> using namespace std; const int maxn=1e4+1; char ans[maxn][101]; int cnt=0,n; struct node{ int ind; int val; node(){} node(int i,int v):ind(i),val(v){} bool operator < (const node &p)const{ return val>p.val; } }score[105]; multiset<node>ss; typedef multiset<node>::iterator iter; inline int counter(){ //相同最大值的个数 int key=(ss.begin())->val; int cntt=0; for(iter c=ss.begin();c!=ss.end();++c){ if(c->val==key) ++cntt; else break; } return cntt; } inline void deal(int k,int *a){ for(int i=0;i<k;++i){ if(score[a[i]].val>0) score[a[i]].val-=1; ss.insert(score[a[i]]); } for(int i=0;i<n;++i){ int ok=0; for(int j=0;j<k;++j) if(a[j]==i) {ok=1;break;} if(ok) ans[cnt][i]='1'; else ans[cnt][i]='0'; } cnt++; } //模拟 void solve(){ int cntt=counter(); if(cntt==n) return; int k=0,a[5]; if(cntt==6) cntt=4; else if(cntt>=7) cntt=5; else if(cntt==1) cntt=2; for(int i=0;i<cntt;++i){ iter c=ss.begin(); a[k++]=c->ind; ss.erase(c); } deal(k,a); solve(); } int main(){ scanf("%d",&n); for(int i=0;i<n;++i){ scanf("%d",&score[i].val); score[i].ind=i; ss.insert(score[i]); } solve(); printf("%d\n",(ss.begin())->val); printf("%d\n",cnt); for(int i=0;i<cnt;++i) printf("%s\n",ans[i]); return 0; }
如有不当之处欢迎指出!
CodeForces - 730A 贪心+模拟的更多相关文章
- Population Size CodeForces - 416D (贪心,模拟)
大意: 给定$n$元素序列$a$, 求将$a$划分为连续的等差数列, 且划分数尽量小. $a$中的$-1$表示可以替换为任意正整数, 等差数列中必须也都是正整数. 贪心策略就是从前到后尽量添进一个等差 ...
- Arthur and Questions CodeForces - 518E (贪心模拟)
大意: 给定序列$a$, 某些位置为'?', 求给'?'赋值使得序列$(a_1+a_2+...+a_k,a_2+a_3+...+a_{k+1},...)严格递增, 且$\sum|a_i|$最小. 化简 ...
- Codeforces 1042C (贪心+模拟)
题面 传送门 分析 思路简单,但代码较复杂的贪心 分类讨论: 有0 负数有奇数个:将绝对值最小(实际最大)的负数和0全部乘到一起,最后删掉0 负数有偶数个:将0全部乘到一起,最后删掉0 没有0 负数有 ...
- Sums of Digits CodeForces - 509C (贪心,模拟)
大意: 一个未知严格递增数组$a$, 给定每个数的数位和, 求$a[n]$最小的数组$a$ #include <iostream> #include <algorithm> # ...
- Music in Car CodeForces - 746F (贪心,模拟)
大意: n首歌, 第$i$首歌时间$t_i$, 播放完获得贡献$a_i$, 最多播放k分钟, 可以任选一首歌开始按顺序播放, 最多选w首歌半曲播放(花费时间上取整), 求贡献最大值. 挺简单的一个题, ...
- 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...
- CodeForces ---596B--Wilbur and Array(贪心模拟)
Wilbur and Array Time Limit: 2000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Su ...
- 贪心+模拟 ZOJ 3829 Known Notation
题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...
- Largest Beautiful Number CodeForces - 946E (贪心)
大意: 定义一个好数为位数为偶数, 且各位数字重排后可以为回文, 对于每个询问, 求小于$x$的最大好数. 假设$x$有$n$位, 若$n$为奇数, 答案显然为$n-1$个9. 若为偶数, 我们想让答 ...
随机推荐
- Python输出hello world(各行命令详解)
创建main.py文件并粘贴下面代码 点击右键运行Debug 'main'后,下方的Debug窗口会出现ImportError: No module named 'bottle'这样的提示,提示导入b ...
- Servlet--SingleThreadModel接口,RequestDispatcher接口
SingleThreadModel接口 定义 public interface SingleThreadModel; 这是一个空接口,它指定了系统如何处理对同一个 Servlet 的调用.如果一个 S ...
- 渲染引擎(The rendering engine)
渲染引擎的职责就是渲染,即在浏览器窗口中显示所请求的内容.这是每一个浏览器的核心部分,所以渲染引擎也称为浏览器内核. 渲染引擎一开始会从网络层获取请求文档的内容. 获取文档后,渲染引擎开始解析 htm ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
- js点击图片查看大图,并可以拖动,且滚动滑轮放大缩小
方法一:此方法在页面没有滚动条时无法缩放 JQuery function hideMax(){ $(".MAX_div").remove(); $("#Cover_Div ...
- ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
在上文中,我们讨论了事件处理器中对象生命周期的问题,在进入新的讨论之前,首先让我们总结一下,我们已经实现了哪些内容.下面的类图描述了我们已经实现的组件及其之间的关系,貌似系统已经变得越来越复杂了. 其 ...
- docker挂载NVIDIA显卡运行pytorch
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 写在前面: 请参考之前的文章安装好CentOS.NVIDIA相关驱动及软件.docker及 ...
- *C语言有关指针的变量声明中的几个易错点
转至:http://my.oschina.net/ypimgt/blog/108265 Technorati 标签: 指针, typedef, const, define 我们都知道,至少听说过 ...
- xBIM 日志操作
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- C++/C高质量编程指南-笔记
复习: C/C++高质量编程指南: [规则1-2-1]为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块. [规则1-2-2]用 #include <file ...