首页 > 其他分享 >Codeforces Round 807 (Div. 2) B. Mark the Dust Sweeper

Codeforces Round 807 (Div. 2) B. Mark the Dust Sweeper

时间:2023-09-10 20:11:39浏览次数:47  
标签:Sweeper 魔法 int sum 房间 Codeforces Mark && 积灰

需要打扫 \(n\) 个房间,第 \(i\) 个房间有 \(a_i\) 的积灰。只能使用如下魔法打扫:

  • 选择 \(i, j, (1 \leq i < j \leq n, \min_{k = i}^{j} a_i > 0)\) 。
  • 执行 \(a_i = a_i - 1, a_j = a_j + 1\) 。

需要将 \(1 \sim n - 1\) 号房间的积灰全部清空,最少使用多少次魔法。

观察一:显然最后所有的积灰会被移到第 \(n\) 个房间。

  • 从贡献角度考虑, \(n\) 号房间必须消耗 \(\sum_{i = 1}^{n-1} a_i\) 次魔法。

观察二:从第一个有积灰的房间开始,到 \(n - 1\) 号房间,所有积灰为 \(0\) 的房间会作为一次中转。

  • 从贡献角度考虑:从第一个有积灰的房间往右,一个积灰为 \(0\) 的房间必须且仅会消耗一次魔法获得 \(1\) 的积灰。

观察三:其他房间不会消耗贡献。

令 \([1, n - 1]\) 中第一个没有积灰的房间坐标为 \(l\) ,\(l = 0\) 表示不存在。

for (int i = 1; i < n; i++) if (l == 0 && a[i] == 0 && a[i - 1] > 0) l = i;

答案为 \([l \neq 0]\sum_{i = l}^{n-1}[a_i=0] + \sum_{i=1}^{n-1}a_i\) 。

view
#include <bits/stdc++.h>
void solve() {
	int n; std::cin >> n;
	std::vector<int> a(n+1);
	int l = 0; long long sum = 0;
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	for (int i = 1; i < n; i++) if (l == 0 && a[i] == 0 && a[i - 1] > 0) l = i;
	for (int i = 1; i < n; i++) sum += a[i];
	std::cout << sum + (l != 0) * std::count(a.begin() + l, a.begin() + n, 0) << '\n';
	
}
signed main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
} 

标签:Sweeper,魔法,int,sum,房间,Codeforces,Mark,&&,积灰
From: https://www.cnblogs.com/zsxuan/p/17691743.html

相关文章

  • Codeforces Round 811 (Div. 3) A. Everyone Loves to Sleep
    闹钟设有\(n\)个时间点,第\(i\)个时间为\((H_i,M_i)\)。在\(h,m\)时刻入睡,响铃必须起床,问能睡多久。使用\(set<pair<int,int>>\)存储闹铃时刻,然后在其中\(lower_{bound}\)到\(<first\geqh,second\geqm>\)的迭代器\(it\)。若\(it=end\),则\(it=begin......
  • Codeforces Round 819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
    给一个长为\(n\)的正整数数组,执行以下操作严格一次。选择\(l,r,(1\leql<r\leqn)\),任意一个正整数\(k\)。重复\(k\)次:让\([l,r]\)的数组成环,按顺时针走一次。希望\(a_n-a_1\)最大,找到这个数。分类讨论题。先判断\(n\)为\(1\)时\(a_n-a_1\)......
  • Codeforces Round 830 (Div. 2) B. Ugu
    给一个\(01\)字符串,需要使它变为非降的,可以执行以下操作:选择一个下标\(i,(1\leqi\leqn)\),\(\forallj\geqi\)的数位翻转。经典的按无后效性翻转问题。考虑从前往后,得到一个全\(0\)串。若开始存在\(1\),则答案减\(1\)。如果存在\(1\),遇到\(1\)便翻转后......
  • $Codeforces Round 891 (Div. 3)$
    \(A.ArrayColoring\)显然需要奇数个偶数即可满足题目。voidsolve(){intn=read(),res=0;for(inti=1;i<=n;i++){intx=read();if(x%2)res++;}puts(res%2==0?"YES":"NO");//puts(ans>0?"Yes":"No&......
  • 【RocketMQ】启动NameServer和Broker报错Unrecognized VM option ‘UseConcMarkSweepG
    问题描述启动RocketMQNameServer和RocketMQBroker报错。mqnamesrv.cmdUnrecognizedVMoption'UseConcMarkSweepGC'Error:CouldnotcreatetheJavaVirtualMachine.Error:Afatalexceptionhasoccurred.Programwillexit.mqbroker.cmd[0.004s][warning][gc]......
  • Markdown学习
    Markdown学习二级标题三级标题四级标题字体Hello,World!Hello,World!Hello,World!Hello,World!引用选择狂神说java,走向人生巅峰分割线图片超链接点击跳转到狂神博客列表Adc\51表格名字性别生日张三男2000.12.15代码ddda......
  • Salesforce Marketing Cloud 获取Token
    当我们要调用MarketingCloud的Api时,不管是SOAP还是REST都需要进行验权Authorization。如果我们需要使用v2版本去获取token,我们需要传递5个参数,其中有3个参数是必须要传递的,2个可选参数,参考官网的文档AccessTokenforServer-to-ServerIntegrations|MarketingCloudAPIsand......
  • Codeforces Round 824 (Div. 2) B. Tea with Tangerines
    有\(n\)块橘子皮,第\(i\)块大小为\(a_i\)。在一部操作中可以把一块橘子皮分成两块,即这块橘子皮为\(x\),让\(x\)变为\(y,z(x=y+z)\)。希望对于任意两块橘子皮,他们相差严格小于两倍。即两块中更小的为\(x\),更大的为\(y\),有\(2x>y\)。最少需要执行多少步操作......
  • 【题解】Educational Codeforces Round 143(CF1795)
    A.TwoTowers题目描述:有\(a,b\)两座由红蓝色方块垒成的塔,其中\(a\)的高度为\(n\);\(b\)的高度为\(m\),用R代表红色;用B代表蓝色。你可以多次把其中一座顶端的方块移到另一座的顶端(可以不移动)。问有没有一种方法可以使两座塔中均没有连续的同颜色方块。题目分析:可以......
  • Codeforces Round 827 (Div. 4) C. Stripes
    在一个\(8\times8\)的网格上,一开始无色。每次一整行或一整列地染色,后染的颜色会覆盖前染的颜色。染色方式有两种,一种是横着染\(R\)色,一种是竖着染\(B\)色。给出最终染色的网格,问最后染的色是哪种。对每行开\(R\)计数器、每列开\(B\)计数器。遍历行、列,如果计数器的......