啊
去年NOIP惨不忍睹的回忆
不讲了,暴力dfs就行
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=15;
int test,n,a[N],ans;
inline void Read(int &x){
static char ch;
while((ch=getchar())<'0' || ch>'9');
x=ch-'0';
while((ch=getchar())>='0' && ch<='9')x=(x<<3)+(x<<1)+ch-'0';
}
void dfsa(int x,int y){
if(x==0){ans=min(ans,y);return;}
for(int i=1;i<=14;i++)if(a[i]>0)y+=a[i];
ans=min(ans,y);return;
}
void dfsb(int x,int y){
if(x==0){ans=min(ans,y);return;}
if(a[14]>=2){
a[14]-=2;
dfsb(x-2,y+1);
a[14]+=2;
}
dfsa(x,y);
}
void dfsc(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=13;i++){
if(a[i]>=2){
a[i]-=2;
dfsc(x-2,y+1,i);
a[i]+=2;
}
}
dfsb(x,y);
}
void dfsd(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=14;i++){
if(a[i]>=3){
a[i]-=3;
dfsd(x-3,y+1,i);
a[i]+=3;
}
}
dfsc(x,y);
}
void dfse(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=14;i++){
if(a[i]>=4){
a[i]-=4;
dfse(x-4,y+1,i);
a[i]+=4;
}
}
dfsd(x,y);
}
void dfsf(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=14;i++){
if(a[i]>=3){
for(int j=1;j<=14;j++){
if(j==i)continue;
else if(a[j]>=1){
a[i]-=3;
a[j]--;
dfsf(x-4,y+1,i);
a[i]+=3;
a[j]++;
}
}
}
}
dfse(x,y);
}
void dfsg(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=14;i++){
if(a[i]>=3){
for(int j=1;j<=13;j++){
if(j==i)continue;
else if(a[j]>=2){
a[i]-=3;
a[j]-=2;
dfsg(x-5,y+1,i);
a[i]+=3;
a[j]+=2;
}
}
}
}
dfsf(x,y);
}
void dfsh(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=8;i++){
for(int j=1;i+j<=13;j++){
if(a[i+j-1]==0)break;
if(j>=5){
for(int k=1;k<=j;k++)a[i+k-1]--;
dfsh(x-j,y+1,i);
for(int k=1;k<=j;k++)a[i+k-1]++;
}
}
}
dfsg(x,y);
}
void dfsi(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=10;i++){
for(int j=1;i+j<=13;j++){
if(a[i+j-1]<2)break;
if(j>=3){
for(int k=1;k<=j;k++)a[i+k-1]-=2;
dfsi(x-j*2,y+1,i);
for(int k=1;k<=j;k++)a[i+k-1]+=2;
}
}
}
dfsh(x,y);
}
void dfsj(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=11;i++){
for(int j=1;i+j<=13;j++){
if(a[i+j-1]<3)break;
if(j>=2){
for(int k=1;k<=j;k++)a[i+k-1]-=3;
dfsj(x-j*3,y+1,i);
for(int k=1;k<=j;k++)a[i+k-1]+=3;
}
}
}
dfsi(x,y);
}
void dfsk(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=14;i++){
if(a[i]>=4){
for(int j=1;j<=14;j++){
if(i==j || a[j]==0)continue;
for(int k=1;k<=14;k++){
if(i==k || j==k || a[k]==0)continue;
a[i]-=4;
a[j]--;
a[k]--;
dfsk(x-6,y+1,i);
a[i]+=4;
a[j]++;
a[k]++;
}
}
for(int j=1;j<=14;j++){
if(i==j)continue;
if(a[j]<2)continue;
a[i]-=4;
a[j]-=2;
dfsk(x-6,y+1,i);
a[i]+=4;
a[j]+=2;
}
}
}
dfsj(x,y);
}
void dfsl(int x,int y,int t=1){
if(x==0){ans=min(ans,y);return;}
for(int i=t;i<=14;i++){
if(a[i]>=4){
for(int j=1;j<=13;j++){
if(i==j || a[j]<2)continue;
for(int k=1;k<=13;k++){
if(i==k || j==k || a[k]<2)continue;
a[i]-=4;
a[j]-=2;
a[k]-=2;
dfsl(x-8,y+1,i);
a[i]+=4;
a[j]+=2;
a[k]+=2;
}
}
for(int j=1;j<=13;j++){
if(i==j && a[j]<8)continue;
if(a[j]<4)continue;
a[i]-=4;
a[j]-=4;
dfsl(x-8,y+1,i);
a[i]+=4;
a[j]+=4;
}
}
}
dfsk(x,y);
}
int main(){
freopen("4325.in","r",stdin);
freopen("4325.out","w",stdout);
Read(test);Read(n);
while(test--){
memset(a,0,sizeof(a));
for(register int i=1;i<=n;i++){
int x,y;
Read(x);Read(y);
if(x==0)a[14]++;
else if(x>2)a[x-2]++;
else a[x+11]++;
}
ans=n;
dfsl(1,0);
printf("%d\n",ans);
}
return 0;
}
评论 (0)