题目

你有\(n\)个士兵,需要将他们分成\(m\)组,每组可以为0;

现在这些士兵要去攻打\(m\)个敌人,每个敌人的生命值为\(hp_i\) ;

一轮游戏中一组士兵选定一个攻打的敌人,敌人生命值-=这组的人数;

胜利的判定是所有敌人的生命值为非正的;

输出胜利的最小轮数,可以达到最小轮数的分配方式,并输出每轮的策略;

\(1 \le m \le n \le 10^6 \ , \ 1 \le \sum hp_i \le 10^6\) ;

题解

  • 答案的下界是\(\lceil \frac{\sum_{i=1}^{m} \ hp_i} n \rceil\) ,考虑构造这个下界;

  • 注意到所有的和为\(n\),首先让 ​$ hp_i $ 对 ​$ n $ 取模;

    只需要构造

    \[\begin{cases}
    s_i &= (\sum_{j=1}^{i} hp_j) \ mod \ n &i \lt m \\
    s_i &= n &i = m \\
    \end{cases}
    \]

  • 排序得到\(s_1,\cdots,s_{m-1},s_m\),构造\(s_i-s_{i-1}\)即可;

  • 容易知道只有最后一次的\(n\)没有被充分利用,所以满足下界;

  • 再 \(for\) 一遍模拟取模的过程求出策略即可;

    #include<bits/stdc++.h>
    #define mk make_pair
    #define fi first
    #define se second
    #define pb push_back
    using namespace std;
    const int N=1000010;
    int n,m,a[N],pos[N],cnt;
    pair<int,int>b[N];
    vector<int>ans[N];
    char gc(){
    static char*p1,*p2,s[1000000];
    if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    int rd(){
    int x=0;char c=gc();
    while(c<'0'||c>'9')c=gc();
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
    return x;
    }
    char ps[1000000],*pp=ps;
    void flush(){
    fwrite(ps,1,pp-ps,stdout);
    pp=ps;
    }
    void push(char x){
    if(pp==ps+1000000)flush();
    *pp++=x;
    }
    void write(int x){
    static int sta[20],top;
    if(!x){push('0');return;}
    while(x)sta[++top]=x%10,x/=10;
    while(top)push(sta[top--]^'0');
    }
    int main(){
    // freopen("G.in","r",stdin);
    // freopen("G.out","w",stdout);
    n=rd();m=rd();
    for(int i=1;i<=m;++i){
    a[i]=rd();
    int tmp=a[i]/n;
    for(int k=1;k<=tmp;++k)
    for(int j=1;j<=m;++j)ans[j].pb(i);
    a[i]%=n;
    }
    for(int i=1,now=0;i<=m;++i){
    now+=a[i];
    if(now>=n)now-=n;
    if(i!=m)b[i]=mk(now,i);
    }
    sort(b+1,b+m);
    b[m]=mk(n,m);
    b[0]=mk(0,0);
    for(int i=1;i<=m;++i)pos[b[i].se]=i;
    for(int i=1,lst=1,now=0;i<=m;++i){
    now+=a[i];
    if(now>=n){
    for(;lst<=m;++lst)ans[lst].pb(i);
    lst=0;now-=n;
    }
    if(!now)continue;
    for(;lst<=pos[i];++lst)ans[lst].pb(i);
    }
    cnt=ans[1].size();
    write(cnt),push('\n');
    for(int i=1;i<=m;++i)write(b[i].fi-b[i-1].fi),push(' ');
    push('\n');
    for(int i=0;i<cnt;++i){
    for(int j=1;j<=m;++j)write(ans[j][i]),push(' ');
    push('\n');
    }
    flush();
    return 0;
    }

【cf contest 1119 G】Get Ready for the Battle的更多相关文章

  1. 【cf contest 1119 H】Triple

    题目 给出 \(n\) 个三元组\(\{ a_i,b_i,c_i \}\)和\(x,y,z\): 将每个三元组扩展成(\(x\)个\(a_i\),\(y\)个\(b_i\),\(z\)个\(c_i\) ...

  2. 【codeforces contest 1119 F】Niyaz and Small Degrees

    题目 描述 \(n\) 个点的树,每条边有一个边权: 对于一个 \(X\) ,求删去一些边后使得每个点的度数 \(d_i\) 均不超过 \(X\) 的最小代价: 你需要依次输出 \(X=0 \to n ...

  3. 【Cf Edu #47 G】Allowed Letters

    这个题大概就是每一个位置都有一个能填字符的限制(一个点集),给出已有的$n$个字符,问能填出的最小字典序的字符串. 总体思路是贪心,每一位尽量选最小的字符. 关键在于判断在某位选了一个字符后,接下来的 ...

  4. B. Lost Number【CF交互题 暴力】

    B. Lost Number[CF交互题 暴力] This is an interactive problem. Remember to flush your output while communi ...

  5. 【CF contest/792/problem/E】

    E. Colored Balls time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  6. 【CF edu 27 G. Shortest Path Problem?】

    time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standa ...

  7. 3.26-3.31【cf补题+其他】

      计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...

  8. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

  9. 【郑轻邀请赛 G】密室逃脱

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2133 [题意] [题解] 考虑每一个二进制数的最高位->第i位; 肯定是1(这 ...

随机推荐

  1. 处女篇:自用C#后端SqlHelper.cs类

    自用SqlHelper.cs类,此类来自软谋教育徐老师课程SqlHelper.cs! using System; using System.Collections; using System.Coll ...

  2. 使用NPOI进行Excel操作

    一.NPOI组件导入 右键项目菜单,“管理NuGet程序包” 直接搜索“NPOI”即会出现列表,下载第一个进行安装即可 安装完成后项目引用会出现以下几项 二.基础使用 添加引用 using NPOI. ...

  3. [SDOI2008]仪仗队(欧拉函数)

    题目 [SDOI2008]仪仗队 解析 这个题,我也不知道他们的soltion是怎么写的这么长的. 我们发现我们一次看一条直线上的第一个点,也就是说,若两个点斜率\(k=\frac{y}{x}\)相同 ...

  4. Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束

    Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎:    MySQL中的数据用各种不同的技术存储在文件( ...

  5. 【开发笔记】- QQ消息轰炸

    1.右键新建一个文本文件: 2.打开记事本将如下代码复制过去: On Error Resume Next Dim wsh,ye set wsh=createobject("wscript.s ...

  6. Pod和Namespace的基本介绍

    namespace资源名称空间 删除namespace资源会级联删除其所包含的所有其它资源对象    名称空间仅仅只是用来限制资源名称的作用域      并不能实现Pod的通信隔离 在名称空间下操作s ...

  7. 阿里云搭建git服务器

    阿里云服务器环境: CentOS7.0 jdk1.8.0 jre1.8.0 RAM:1G SWAP:3G MEM:40G apache-tomcat 8.0 1.下载gitlab-ce 11.0 到本 ...

  8. 大数据之kafka-05.讲聊聊Kafka的版本号

    今天聊聊kafka版本号的问题,这个问题实在是太重要了,我觉得甚至是日后能否用好kafka的关键.上一节我们介绍了kafka的几种发行版,其实不论是哪种kafka,本质上都内嵌了最核心的Apache ...

  9. MySQL Replication--TABLE_ID与行格式复制

    BINLOG中的TABLE_ID 在ROW格式的二进制中,事件信息中没有列的信息,需要通过Table_Map将表名对于的表信息加载到cache中,然后根据事件信息中的列下标来定位到数据列,每次表信息加 ...

  10. MySQL DataType--浮点数(Floating-Point Types)学习

    浮点数(Floating-Point Types) MySQL支持两种浮点数类型来表示近似值:1.FLOAT,单精度浮点数,使用4字节存储,存储数据范围3.402823466E+38 - -1.175 ...