大佬们,帮忙看下哪里错了吧,只有#4是AC,其他都只输出-1
查看原帖
大佬们,帮忙看下哪里错了吧,只有#4是AC,其他都只输出-1
808938
ScSquid楼主2023/12/17 19:30
#include<iostream>
#include<string.h>

using namespace std;

int n, q, sq = 0, lq = 0, nd[110][110], nl[110][110], nt[110][110];

bool check(int x)
{
    memset(nt, 0, sizeof nt);
    int t1 = x % n, t2 = x / n, t3, t = sq;
    for(int i = 1; i <= n; i ++){
        for(int j = 1; j <= n; j ++){
            t3 = t2 + (int)(t1 >= i);
            if(t3 > (nd[i][j] - nt[i][j] - nl[i][j])) t3 = nd[i][j] - nt[i][j] - nl[i][j];
            t -= t3 * 2;
            nt[i][j] = nt[j][i] += t3;
        }
        if(t <= q) return true;
    }
    return false;
}

int main()
{
    scanf("%d%lld", &n, &q);
    for(int i = 1; i <= n; i ++)
    for(int j = 1; j <= n; j ++){ 
        scanf("%d", &nd[i][j]);
        sq += nd[i][j];
    }
    if(sq <= q){
        printf("0");
        return 0;
    }
    for(int i = 1; i <= n; i ++)
    for(int j = 1; j <= n; j ++){ 
        scanf("%d", &nl[i][j]);
        lq += nl[i][j];
    }
    if(lq > q){
        printf("-1");
        return 0;
    }
    int l = -1, r = sq + 1;
    while ((l + 1) < r){
        int mid = (l + r) / 2;
        if(check(mid)) r = mid;
        else l = mid;
    }
    if(r == (sq + 1)) printf("-1");
    else printf("%d", r);
    return 0;
}
2023/12/17 19:30
加载中...