【cf contest 1119 G】Get Ready for the Battle
题目
你有\(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的更多相关文章
- 【cf contest 1119 H】Triple
题目 给出 \(n\) 个三元组\(\{ a_i,b_i,c_i \}\)和\(x,y,z\): 将每个三元组扩展成(\(x\)个\(a_i\),\(y\)个\(b_i\),\(z\)个\(c_i\) ...
- 【codeforces contest 1119 F】Niyaz and Small Degrees
题目 描述 \(n\) 个点的树,每条边有一个边权: 对于一个 \(X\) ,求删去一些边后使得每个点的度数 \(d_i\) 均不超过 \(X\) 的最小代价: 你需要依次输出 \(X=0 \to n ...
- 【Cf Edu #47 G】Allowed Letters
这个题大概就是每一个位置都有一个能填字符的限制(一个点集),给出已有的$n$个字符,问能填出的最小字典序的字符串. 总体思路是贪心,每一位尽量选最小的字符. 关键在于判断在某位选了一个字符后,接下来的 ...
- B. Lost Number【CF交互题 暴力】
B. Lost Number[CF交互题 暴力] This is an interactive problem. Remember to flush your output while communi ...
- 【CF contest/792/problem/E】
E. Colored Balls time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 【CF edu 27 G. Shortest Path Problem?】
time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standa ...
- 3.26-3.31【cf补题+其他】
计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...
- 【cf补题记录】Codeforces Round #608 (Div. 2)
比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...
- 【郑轻邀请赛 G】密室逃脱
[题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2133 [题意] [题解] 考虑每一个二进制数的最高位->第i位; 肯定是1(这 ...
随机推荐
- c# 结构体实现数据新增(数据字段较多的情况使用) 一
点击新增按钮 { ChkFormIDBox.Text = Coeno.DevChk.DevChk.CleanUpInput(ChkFormIDBox.Text); --清除表单文本框数据输入 if ...
- 两台Windows的 IIS 应用站点 基于NLB + ARR 实现双机热备和负载
IIS负载均衡中我们使用微软的ARR,但提到网站的高可用性,ARR只能做请求入口的消息分发服务,这样如果我们的消息分发服务器给down掉啦,那么做再多的应用服务集群也都枉然. 这里我们主要针对解决这一 ...
- dump net core windbg 安装
安装 1.下载工具windbg 地址:https://www.microsoft.com/zh-cn/p/windbg-preview/9pgjgd53tn86?SilentAuth=1&rt ...
- spring中bean的作用域属性singleton与prototype的区别
1.singleton 当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会 ...
- 【面试突击】- sql语句的优化分析
开门见山,问题所在 原文地址:http://www.cnblogs.com/knowledgesea/p/3686105.html sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种 ...
- python错误日志记录工具,解决项目排错问题
我们写项目的时候难免会遇到代码报错的问题,遇到这样的问题了如何快速的定位问题并解决问题呢? 我今天来整理了利用python只带的工具来解决这个问题,我能需要使用的库有: logging os 这些都是 ...
- insmod/rmmod
insmod -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入 -k 将模块设置为自动卸除 -m 输出模块的载入信息 -o <模块名称> 指定模块的名 ...
- 笔谈kxmovie开源播放器库的使用
开源播放器项目 kxmovie(https://github.com/kolyvan/kxmovie),现在仍然是很多刚开始接触播放器开发的程序员的参照范本.以下是我操作kxmovie项目的过程: ( ...
- css display block 和 inline
根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级 ...
- 离线安装Kubernetes
离线安装Kubernetes 环境准备: systemctl stop firewalld systemctl disable firewalld 关闭selinux sed -i 's/^S ...