62分求调
  • 板块P1283 平板涂色
  • 楼主IC0CI
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/7 16:45
  • 上次更新2024/12/7 19:37:54
查看原帖
62分求调
366572
IC0CI楼主2024/12/7 16:45

62分求调 整个机房都找不出问题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls (p << 1)
#define rs (ls | 1)
#define mid ((pl + pr) >> 1)

int rd()
{
    int x = 0,w = 1;
    char ch = 0;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') w = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = x * 10 + (ch - '0');
        ch = getchar();
    }
    return x * w;
}

int f[131082][25];
struct rec
{
    int lx,ly,rx,ry,col;
}a[20];
int n;

bool check(int d,int num)
{
    bool flag = 1;
    for(int i = 1;i <= n && flag;i++)
    {
        if(a[i].ry != a[num].ly) continue;
        if(!(a[i].lx >= a[num].rx && a[i].rx <= a[num].lx))
        {
            flag &= ((d >> (i - 1)) & 1);
        }
    }
    return flag;
}

signed main()
{
    n = rd();
    for(int i = 1;i <= n;i++) a[i].lx = rd(),a[i].ly = rd(),a[i].rx = rd(),a[i].ry = rd(),a[i].col = rd();
    memset(f,0x3f,sizeof(f));
    for(int i = 1;i <= 20;i++) f[0][i] = 1;
    for(int i = 1;i < (1 << n);i++)
    {
        for(int j = 1;j <= n;j++)
        {
            if(((i >> (j - 1)) & 1) && check(i,j))
            {
                for(int c = 1;c <= 20;c++)
                {
                    f[i][a[j].col] = min(f[i][a[j].col],f[i - (1 << (j - 1))][c] + 1 - (a[j].col == c));
                }
            }
        }
    }
    int ans = 0x3f3f3f3f;
    for(int i = 1;i <= 20;i++)
    {
        ans = min(ans,f[(1 << n) - 1][i]);
    }
    cout << ans;
    return 0;
}
2024/12/7 16:45
加载中...