65 Wrong Answer,有大犇能帮我看一下吗
查看原帖
65 Wrong Answer,有大犇能帮我看一下吗
1001524
UniqueYou楼主2023/7/14 14:41
#include <bits/stdc++.h>
using namespace std;
long long n, m, k, up[10005], dn[10005], h1[10005], h2[10005], f[10005][1005], jd[10005], ans = 0x3f3f3f3f;
//up:每列上升高度,dn:每列下降高度,h1:下面水管高度,h2:上面水管最低处的高度,jd:记录到每一列已经通过的管子数量
int main()
{
    cin >> n >> m >> k;
    for (int i = 0; i < n; i++)
        cin >> up[i] >> dn[i];
    for (int i = 0; i <= n; i++)
    {
        h1[i] = 1;
        h2[i] = m;
    }
    for (int i = 1; i <= k; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        h1[x] = y+1;
        h2[x] = z-1;
        jd[x] = 1;
    }
    for (int i = 1; i <= n; i++)
        jd[i] += jd[i-1];//前缀和
    memset(f, 0x3f, sizeof(f));
    for (int i = 0; i <= m; i++)
        f[0][i] = 0;
    int l = 1, h = m;
    for (int i = 1; i <= n; i++)
    {
        bool ok = 0;//ok记录能否通过这一列
        for (int j = h1[i]; j <= h2[i]; j++)
        {
            if (j == m)
                for (int k = m-up[i-1]; k < m; k++)
                    f[i][m] = min(min(f[i][m], f[i][k]+1), f[i-1][k]+1);  //到顶判断一下
            else if (up[i-1] + l <= j)
                f[i][j] = min(min(f[i][j], f[i][j-up[i-1]]+1), f[i-1][j-up[i-1]]+1);//取连续上升和从前一列上升的最优解
            if (f[i][j] < 0x3f3f3f3f)
                ok = 1;
        }
        for (int j = h1[i]; j <= h2[i]; j++)
            if (h - dn[i-1] >= j)
            {
                f[i][j] = min(f[i][j], f[i-1][j+dn[i-1]]);
                if (f[i][j] < 0x3f3f3f3f)
                    ok = 1;
            }
        if (ok == 0)
        {
            cout << 0 << "\n" << jd[i-1];
            return 0;
        }
        for (int j = h1[i]; j <= h2[i]; j++)
            if (f[i][j] < 0x3f3f3f3f)
            {
                l = j;
                break;
            }
        for (int j = h2[i]; j >= h1[i]; j--)
            if (f[i][j] < 0x3f3f3f3f)
            {
                h = j;
                break;
            }
    }l和h记录前一列可能的范围
    for (int i = 1; i <= m; i++)
        ans = min(ans, f[n][i]);
    cout << 1 << "\n" << ans;
    return 0;
}
2023/7/14 14:41
加载中...