题解 | 小美的蛋糕切割

小美的蛋糕切割

https://www.nowcoder.com/practice/15aa2c407c8840e09e2532313fb6809d?tpId=376&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D10%26subTabName%3Donline_coding_page

看到很多人说二位前缀和,不禁有些奇怪,有那么复杂吗?这题完全就用不到动态规划呀,纯数字计算不就好了?

说说我的思路,首先维护两个一维数组row和col,分别保存矩阵每一行的元素和,与每一列的元素和。这一步在数据输入的时候就完成了,同时我们还得到了矩阵所有元素的和sum。

接下来分别计算横着切和竖着切,以横着切为例,初始时ans = sum,s1 = 0,s2 = sum。

遍历数组row,s1 += row[i],s2 -= row[i]。如果s1和s2差的绝对值 < ans,更新ans。当s2 < s1时跳出循环。

竖着切一样操作,只不过吧数组row换成col即可。最后输出ans。

下面贴出c++代码。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m, a;
    cin >> n >> m;
    vector<int> row(n, 0), col(m, 0);
    long long sum = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> a;
            row[i] += a;
            col[j] += a;
            sum += a;
        }
    }
    long long ans = sum;
    long long s12, s1 = 0, s2 = sum;
    for (int i = 0; i < n; ++i) {
        s1 += row[i];
        s2 -= row[i];
        s12 = abs(s2 - s1);
        ans = min(ans, s12);
        if (s2 < s1) break;
    }
    s1 = 0;
    s2 = sum;
    for (int i = 0; i < m; ++i) {
        s1 += col[i];
        s2 -= col[i];
        s12 = abs(s2 - s1);
        ans = min(ans, s12);
        if (s2 < s1) break;
    }
    cout << ans;
}

全部评论

相关推荐

08-28 11:37
已编辑
华东师范大学 Java
Sigma777:本来想说师弟怎么把我这个老东西卷没了,仔细一看是师兄 简历不错,但是得准备好选型话术,比如我举个例子你为什么要用caffeine,一般我们的小项目不会有这么hot的key需要本地缓存,你要说明你是如何发现有这么hot的key连redis都兜不住的,引入后优化了多少时间,然后还有本地缓存大小设置为多少,这个大小能保证热点key不会因为太小而淘汰也不会因为太大影响服务吗,为什么不用guava,引入本地缓存同步问题怎么解决。 然后分库分表,为什么你觉得要分表,数据量多少,分多少张表几个库,分片键选择依据,你的所有查询能不能准确定位到某一张避免全库扫描,有没有数据倾斜问题就是分的每张表数据量差距特别大,你是一开始分库分表还是后期发现瓶颈才分,如果后期才分你如何把旧表的数据搬过去同时还能确保业务正常运行。 然后是消息队列,你说缓存高并发请求,却选择了吞吐量较小的rabbit,有什么原因吗,为什么不选Kafka。 然后你说分布式锁解决集群环境并发安全,也就是说你是集群部署的,请问是怎么部署的,docker还是k8s,部署几台,配置是多少,jvm参数设置是多少,有监控吗,线上遇到故障吗,怎么解决的,有做负载均衡吗,数据是怎么压测的等等。 zset缓存本月实时排行数据具体怎么做的,会有大key问题吗。 其他本小渣暂时想不到了,留给其他大神点评
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务