贪心策略:

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 贪心+模拟的更多相关文章

  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. 支付sdk —— 该组件为封装了 微信,支付宝,银联支付

    [精品]  支付组件 简要说明该组件为封装了 微信,支付宝,银联支付, 一键快速集成,几行代码即可集成 微信,支付宝,银联支付. ## 示例: # 测试账号:1.银联支付:提供测试使用卡号.手机号信息 ...

  2. ajax请求获取实时数据

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  3. Asp.net mvc 中View 的呈现(二)

    [toc] 上一节介绍了 Asp.net mvc 中除 ViewResult 外的所有的 ActionResult,这一节介绍 ViewResult. ViewResultBase ViewResul ...

  4. IIS与Apache禁止IP地址直接访问网站

    一.IIS 防止恶意域名指向解决方法 首先单击"开始"-"设置"-"控制面板"-"管理工具",找到"Inter ...

  5. 关于scanf,gets

    1.用了gets后,假如你没有输入任何东西直接[enter],它将执行下一条命令 2.用了scanf后,直接按了[enter],它将换行并等待你的输入,直到你输入非[enter],再执行下一条命令. ...

  6. R语言-探索两个变量

    目的: 通过探索文件pseudo_facebook.tsv数据来学会两个变量的分析流程 知识点: 1.ggplot语法 2.如何做散点图 3.如何优化散点图 4.条件均值 5.变量的相关性 6.子集散 ...

  7. 洛谷 [P1402] 酒店之王

    有两个约束条件的二分图匹配 我们回忆一下二分图匹配的匈牙利算法的具体流程,它是通过寻找增广路来判断最大匹配数的,我们再观察一下题目中的两个条件,只有两个条件都满足,才算找到一条增广路,所以我们可以分别 ...

  8. BZOJ 3720: Gty的妹子树 [树上size分块]

    传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...

  9. Windows下为Lua脚本进行加密处理

    缘由 想对Lua脚本进行安全性处理,可惜一直没有想到很好的解决方案,考虑过用原生Lua将脚本编译成二进制代码,也考虑过用zlib将文件进行加密压缩处理,但是感觉都不是最佳方案,今天忽然想到有个东西叫L ...

  10. sublime插件AndyJS2安装教程

    1.下载AndyJS2包,已整理上传,下载AndyJS2.rar,附上网址.(https://github.com/jiaoxueyan/AndyJS2) 2.点击首选项(preference)=&g ...