贪心策略:

1、只有一个最大值,选着第二大的一起参加比赛减分。

2、有奇数个最大值,选择三个进行比赛。

3、偶数个最大值,选择两个进行比赛。

为什么不把最大值全部选择?

因为最多只能选五个,有可能选择完五个只剩下一个最大值,那么就会进行贪心策略1,会出错。

AC代码:

  1. #include<cstdio>
  2. #include<set>
  3. using namespace std;
  4. const int maxn=1e4+1;
  5. char ans[maxn][101];
  6. int cnt=0,n;
  7. struct node{
  8. int ind;
  9. int val;
  10. node(){}
  11. node(int i,int v):ind(i),val(v){}
  12. bool operator < (const node &p)const{
  13. return val>p.val;
  14. }
  15. }score[105];
  16. multiset<node>ss;
  17. typedef multiset<node>::iterator iter;
  18. inline int counter(){ //相同最大值的个数
  19. int key=(ss.begin())->val;
  20. int cntt=0;
  21. for(iter c=ss.begin();c!=ss.end();++c){
  22. if(c->val==key) ++cntt;
  23. else break;
  24. }
  25. return cntt;
  26. }
  27. inline void deal(int k,int *a){
  28. for(int i=0;i<k;++i){
  29. if(score[a[i]].val>0) score[a[i]].val-=1;
  30. ss.insert(score[a[i]]);
  31. }
  32. for(int i=0;i<n;++i){
  33. int ok=0;
  34. for(int j=0;j<k;++j)
  35. if(a[j]==i) {ok=1;break;}
  36. if(ok) ans[cnt][i]='1';
  37. else ans[cnt][i]='0';
  38. }
  39. cnt++;
  40. }
  41. //模拟
  42. void solve(){
  43. int cnt=counter();
  44. if(cnt==n) return;
  45. int k=0,a[5];
  46. if(cnt==1||cnt%2==0) {
  47. iter c=ss.begin();
  48. a[k++]=c->ind;
  49. ss.erase(c);
  50. c=ss.begin();
  51. a[k++]=c->ind;
  52. ss.erase(c);
  53. deal(k,a);
  54. }
  55. else if(cnt>1&&cnt&1){
  56. iter c=ss.begin();
  57. a[k++]=c->ind;
  58. ss.erase(c);
  59. c=ss.begin();
  60. a[k++]=c->ind;
  61. ss.erase(c);
  62. c=ss.begin();
  63. a[k++]=c->ind;
  64. ss.erase(c);
  65. deal(k,a);
  66. }
  67. solve();
  68. }
  69. int main(){
  70. scanf("%d",&n);
  71. for(int i=0;i<n;++i){
  72. scanf("%d",&score[i].val);
  73. score[i].ind=i;
  74. ss.insert(score[i]);
  75. }
  76. solve();
  77. printf("%d\n",(ss.begin())->val);
  78. printf("%d\n",cnt);
  79. for(int i=0;i<cnt;++i)
  80. printf("%s\n",ans[i]);
  81. return 0;
  82. }

昨晚我又想了下,其实还有一种直观贪心:

1、只有一个最大值,选择最大和第二大进行比赛。

2、如果有6个最大值,选择4个比赛。不能选5个,因为一定要把所有最大值同时处理掉。

3、如果最大值大于6,选择5个比赛。

4、其他大于1小于等于5的情况,就全部选择参加比赛

AC代码:

  1. #include<cstdio>
  2. #include<set>
  3. using namespace std;
  4. const int maxn=1e4+1;
  5. char ans[maxn][101];
  6. int cnt=0,n;
  7. struct node{
  8. int ind;
  9. int val;
  10. node(){}
  11. node(int i,int v):ind(i),val(v){}
  12. bool operator < (const node &p)const{
  13. return val>p.val;
  14. }
  15. }score[105];
  16. multiset<node>ss;
  17. typedef multiset<node>::iterator iter;
  18. inline int counter(){ //相同最大值的个数
  19. int key=(ss.begin())->val;
  20. int cntt=0;
  21. for(iter c=ss.begin();c!=ss.end();++c){
  22. if(c->val==key) ++cntt;
  23. else break;
  24. }
  25. return cntt;
  26. }
  27. inline void deal(int k,int *a){
  28. for(int i=0;i<k;++i){
  29. if(score[a[i]].val>0) score[a[i]].val-=1;
  30. ss.insert(score[a[i]]);
  31. }
  32. for(int i=0;i<n;++i){
  33. int ok=0;
  34. for(int j=0;j<k;++j)
  35. if(a[j]==i) {ok=1;break;}
  36. if(ok) ans[cnt][i]='1';
  37. else ans[cnt][i]='0';
  38. }
  39. cnt++;
  40. }
  41. //模拟
  42. void solve(){
  43. int cntt=counter();
  44. if(cntt==n) return;
  45. int k=0,a[5];
  46. if(cntt==6) cntt=4;
  47. else if(cntt>=7) cntt=5;
  48. else if(cntt==1) cntt=2;
  49. for(int i=0;i<cntt;++i){
  50. iter c=ss.begin();
  51. a[k++]=c->ind;
  52. ss.erase(c);
  53.  
  54. }
  55. deal(k,a);
  56. solve();
  57. }
  58. int main(){
  59. scanf("%d",&n);
  60. for(int i=0;i<n;++i){
  61. scanf("%d",&score[i].val);
  62. score[i].ind=i;
  63. ss.insert(score[i]);
  64. }
  65. solve();
  66. printf("%d\n",(ss.begin())->val);
  67. printf("%d\n",cnt);
  68. for(int i=0;i<cnt;++i)
  69. printf("%s\n",ans[i]);
  70. return 0;
  71. }

如有不当之处欢迎指出!

CodeForces - 730A 贪心+模拟的更多相关文章

  1. Population Size CodeForces - 416D (贪心,模拟)

    大意: 给定$n$元素序列$a$, 求将$a$划分为连续的等差数列, 且划分数尽量小. $a$中的$-1$表示可以替换为任意正整数, 等差数列中必须也都是正整数. 贪心策略就是从前到后尽量添进一个等差 ...

  2. Arthur and Questions CodeForces - 518E (贪心模拟)

    大意: 给定序列$a$, 某些位置为'?', 求给'?'赋值使得序列$(a_1+a_2+...+a_k,a_2+a_3+...+a_{k+1},...)严格递增, 且$\sum|a_i|$最小. 化简 ...

  3. Codeforces 1042C (贪心+模拟)

    题面 传送门 分析 思路简单,但代码较复杂的贪心 分类讨论: 有0 负数有奇数个:将绝对值最小(实际最大)的负数和0全部乘到一起,最后删掉0 负数有偶数个:将0全部乘到一起,最后删掉0 没有0 负数有 ...

  4. Sums of Digits CodeForces - 509C (贪心,模拟)

    大意: 一个未知严格递增数组$a$, 给定每个数的数位和, 求$a[n]$最小的数组$a$ #include <iostream> #include <algorithm> # ...

  5. Music in Car CodeForces - 746F (贪心,模拟)

    大意: n首歌, 第$i$首歌时间$t_i$, 播放完获得贡献$a_i$, 最多播放k分钟, 可以任选一首歌开始按顺序播放, 最多选w首歌半曲播放(花费时间上取整), 求贡献最大值. 挺简单的一个题, ...

  6. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

  7. CodeForces ---596B--Wilbur and Array(贪心模拟)

    Wilbur and Array Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Su ...

  8. 贪心+模拟 ZOJ 3829 Known Notation

    题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...

  9. Largest Beautiful Number CodeForces - 946E (贪心)

    大意: 定义一个好数为位数为偶数, 且各位数字重排后可以为回文, 对于每个询问, 求小于$x$的最大好数. 假设$x$有$n$位, 若$n$为奇数, 答案显然为$n-1$个9. 若为偶数, 我们想让答 ...

随机推荐

  1. sqlserver datetime的bug

    sqlserver datetime 的毫秒的个位似乎存在bug,只有0.3.7这三个值,比如: 2018-01-20 23:59:59:999会变成2018-01-21 00:00:00.000 2 ...

  2. Linux 修改环境变量报错

    报错如下: -bash: export: `=': not a valid identifier -bash: export: `/usr/local/sbin:/usr/local/bin:/sbi ...

  3. js promise看这篇就够了

    一.背景 大家都知道nodejs很快,为什么会这么快呢,原因就是node采用异步回调的方式来处理需要等待的事件,使得代码会继续往下执行不用在某个地方等待着.但是也有一个不好的地方,当我们有很多回调的时 ...

  4. 优秀的基于VUE移动端UI框架合集

    1. vonic 一个基于 vue.js 和 ionic 样式的 UI 框架,用于快速构建移动端单页应用,很简约,是我喜欢的风格 star 2.3k 中文文档 在线预览 2.vux 基于WeUI和Vu ...

  5. Mysql之左连接右连接内连接——示例 (转)

    下面是两张表 表stu 表tech 1.右连接 当使用右连接语句查询时,返回结果如下: 1 SELECT stu.id,stu.name,stu.classe_name,tech.id,tech.na ...

  6. 取IP的几个方法

    ifconfig eth0|grep " inet add"|cut -d":" -f2|cut -d " " -f1 ifconfig e ...

  7. spring之注解详解

    一.类级别注解 通用:@Component("id") Controller层:@Controller("id") Service层:@Service(&quo ...

  8. mybatis-generator 根据表生成对应文件

    1 创建maven工程 2.编辑.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project ...

  9. python中的字符串格式化

    Python中常见的字符串格式化方式包括两种:字符串插入(str%),format函数(str.format()) 1.字符串插入 字符串插入是设置字符串格式的简单方法,与C语言.Fortran语言差 ...

  10. NIO基础篇(一)

    1.NIO与传统IO的比较 Java的NIO(New IO)是不同于旧IO的,旧的IO是基于字节流和字符流的,是阻塞的IO.NIO是基于通道(Channel)和缓冲区(Buffer)的,是非阻塞的IO ...