求助:怎么改都不对!
查看原帖
求助:怎么改都不对!
470348
oddy楼主2022/12/9 15:36

这是代码:

#include <cstdio>
#include <numeric>
#include <cmath>
#include <algorithm>

long long n, m, a[1005][1005], b[1005][1005], c, ans[1000005], s;
double f[1005];

int main() {
    scanf("%lld%lld", &m, &n);
    for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf("%lld", a[i]+j);
    for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf("%lld", b[i]+j);
    for(int i = 1; i <= n; i++) {
        s = std::accumulate(a[i]+1, a[i]+m+1, 0ll);
        for(int j = 1; j <= m; j++) f[i] += llabs(a[i][j] - s);
        s = std::accumulate(b[i]+1, b[i]+m+1, 0ll);
        for(int j = 1; j <= m; j++) f[i] += llabs(b[i][j] - s);
    }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j < n; j++)
            if(f[j] > f[j+1]) std::swap(f[j], f[j+1]), ans[c++] = j;
    printf("%lld\n", c);
    for(int i = 0; i < c; i++) printf("%lld %lld\n", ans[i], ans[i]+1ll);
    return 0;
}

我使用的计算每行不整齐度的公式:

i=1m(ai,jai+bi,jbi)\sum_{i=1}^m(\lvert a_{i,j}-\overline{a_i}\rvert+\lvert b_{i,j}-\overline{b_i}\rvert)

可以证明这不改变大小关系。

我也仔细地进行了检查,但没有发现任何问题。

我猜差错出于 double 的数据精度和范围,但我没有找出问题。

请问我的问题在哪?

2022/12/9 15:36
加载中...