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;
}