c++ - 对于这个 Codeforces 问题,有没有比仅仅使用蛮力更好的解决算法?
问题描述
给你一个数组 a1,a2,…,an。
在一次操作中,您可以选择两个元素 ai 和 aj (i≠j) 并将它们中的每一个减一。
您需要检查是否可以使所有元素都等于零。
解决方案
我认为检查总和是否偶数并且没有元素超过总和的一半就足够了。将 C++17 与参数包扩展和折叠表达式一起使用,这是一个简短的片段:
template<typename ...Ts>
bool check(Ts... an) {
const auto sum = (an + ...);
const auto max = std::max({an...});
return sum % 2 == 0 && max <= sum / 2;
}
您必须一步一步减少两个元素。这意味着总和必须可以被二除。
使所有元素为零的一种算法是减少最大元素和第二个最大元素。对于 max 元素的每次减少,您都需要另一个可以减少的元素。只要最大元素不超过总和的一半,它就可以工作。
推荐阅读
- javascript - 为什么我的 javascript obj 没有在 angularjs 中更新?
- autohotkey - 删除文本末尾的空格
- css - CSS 代码在组件 CSS 中不起作用,但在 Angular 中的 style.css 中起作用
- django - 无法从“app.model”导入名称“model”
- uproot - 在 Uproot 问题中加载 TProfile 获取 y 值
- karate - 空手道:Visual Studio 代码:java.lang.ClassNotFoundException:com.intuit.karate.cli.Main
- reactjs - React 中的倒计时:更新状态还是在 div 上使用引用?
- java - 找到与方向无关的两个向量的交点
- python - 将云运行连接到 postgresql 11 数据库的问题
- ios - 将 ac 库封装在一个用于 iOS 开发的 swift 框架中