74pts求助
查看原帖
74pts求助
844213
carbon_monoxide楼主2023/10/26 22:09

#21,23,24,29,32,33,44,45,46,47,48WA掉了

#include<bits/stdc++.h>
using namespace std;
int t,n,pai[20],ans=0x3f3f3f3f;
void dfs(int diu){
    if(diu>=ans) return;
    for(int i=3;i<=10;i++){
	  	if(!pai[i]) continue;
		int paishu=1;
		for(int j=i+1;j<=15;j++){
			if(paishu>4){
				for(int k=i;k<j;k++) pai[k]--;
				dfs(diu+1);
				for(int k=i;k<j;k++) pai[k]++;
			}
			if(!pai[j]) break;
			paishu++;
		}
	}
	for(int i=3;i<=12;i++){
		if(pai[i]<2) continue;
		int paishu=1;
		for(int j=i+1;j<=15;j++){
			if(paishu>2){
				for(int k=i;k<j;k++) pai[k]-=2;
				dfs(diu+1);
				for(int k=i;k<j;k++) pai[k]+=2;
			}
			if(pai[j]<2) break;
			paishu++;
		}
	}
	for(int i=3;i<=13;i++){
		if(pai[i]<3) continue;
		int paishu=1;
		for(int j=i+1;j<=15;j++){
			if(paishu>1){
				for(int k=i;k<j;k++) pai[k]-=3;
				dfs(diu+1);
				for(int k=i;k<j;k++) pai[k]+=3;
			}
			if(pai[j]<3) break;
			paishu++;
		}
	}
	int t[5]={0};
	for(int i=2;i<=15;i++){
		if(pai[i]<5) t[pai[i]]++;
		else{
			t[0]=pai[i];
			while(t[0]>4) t[4]++,t[0]-=4;
			t[t[0]]++;
		}
	}
	t[0]=t[1]+t[2]+t[3]+t[4];
	for(int i=1;i<=t[4];i++){
		if(t[2]>1) t[2]-=2,t[0]-=2;
		else if(t[1]>1) t[1]-=2,t[0]-=2;
		else break;
	}
	for(int i=1;i<=t[3];i++){
		if(t[2]) t[2]--,t[0]--;
		else if(t[1]) t[1]--,t[0]--;
		else break;
	}
	ans=min(ans,t[0]+diu);
	return;
}
int main(){
	cin>>t>>n;
	while(t--){
		for(int i=1;i<=n;i++){
			int x,y;cin>>x>>y;
			if(x==1) pai[14]++;
			else if(!x) pai[15]++;
			else pai[x]++;
		}
		dfs(0);
	   cout<<ans<<"\n";
	   memset(pai,0,sizeof(pai));
		ans=0x3f3f3f3f;
	}
	return 0;
}
2023/10/26 22:09
加载中...