您的位置:首页 > 汽车 > 时评 > 营销型网站制作方案_在线制图生成器_自媒体平台排名前十_电商平台app大全

营销型网站制作方案_在线制图生成器_自媒体平台排名前十_电商平台app大全

2025/3/16 4:47:09 来源:https://blog.csdn.net/its_a_win/article/details/146098549  浏览:    关键词:营销型网站制作方案_在线制图生成器_自媒体平台排名前十_电商平台app大全
营销型网站制作方案_在线制图生成器_自媒体平台排名前十_电商平台app大全

5539. 牛奶交换 - AcWing题库

y老师的板书

如果是往右循环,且有左循环与之相对头,如图所示,则可以发现,右循环的最后一个和左循环的第一个不会损失,因为分别有其右边和或左边的为它补给,而两端(用红线圈出来的部分)的因为没有补给而损失。所以只需将每一个方向相同R或L的划分为一个整体,剔除不会损失的那一个,将整体中其他的与m取小即可算出每一个整体还剩多少,最后将每一个整体求和即可

 


const int N = 4e5 + 10;//两倍长度LL n,m;
char s[N];
LL a[N];void solve()
{cin >> n >> m;LL ans = 0;for (int i = 1;i <= n;i ++) cin >> s[i];for (int i = 1;i <= n;i ++) cin >> a[i],ans += a[i];for (int i = 1;i <= n;i ++){s[i + n] = s[i];a[i + n] = a[i];}int k = 1;while(k <= n && s[k] == s[k + 1]) k ++;//找可以分开的点if (k < n)//有切口时,计算损失;没有切口时不会损失而是会一直循环{for (int i = k + 1;i + n - 1<= 2 * n;i ++){int j = i;LL sum = 0;while(j <= k + n && s[j] == s[i]) sum += a[j],j ++;if (s[j - 1] == 'R') sum -= a[j - 1];else sum -= a[i];ans -= min(m,sum);i = j - 1;//i++之后i就指向第一个不同的位置了}}cout << ans << endl;
}	

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com