我 人 傻 掉
查看原帖
我 人 傻 掉
169736
Fu_Tao楼主2022/7/16 11:05
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#define it map<ll,ll>::iterator
using namespace std;
typedef long long ll;
//  3 4 5 6 7 8 9 10 11 12 13 1 2 01 02
ll T,n,x,y,ans=1e9+7;
map<ll,ll> m;
void dfs(ll s){
	ll k=0;
	if(s>=ans)return ;
	for(int i=1;i<=12;i++){//1shun
		if(!m[i])k=0;
		else {
			k++;
			if(k>=5){
				for(int j=i;j>=i-k+1;j--)m[j]--;
				dfs(s+1);
				for(int j=i;j>=i-k+1;j--)m[j]++;
			}
		}
	}
	k=0;
	for(int i=1;i<=12;i++){//2shun
		if(m[i]<2)k=0;
		else {
			k++;
			if(k>=3){
				for(int j=i;j>=i-k+1;j--)m[j]-=2;
				dfs(s+1);
				for(int j=i;j>=i-k+1;j--)m[j]+=2;
			}
		}
	}
	k=0;
	for(int i=1;i<=12;i++){//3shun
		if(m[i]<3)k=0;
		else {
			k++;
			if(k>=2){
				for(int j=i;j>=i-k+1;j--)m[j]-=3;
				dfs(s+1);
				for(int j=i;j>=i-k+1;j--)m[j]+=3;
			}
		}
	}
	for(int i=1;i<=13;i++){
		if(m[i]<=3){
			if(m[i]<=2) continue;
			m[i]-=3;
			for(int j=1;j<=14;j++){
				if(m[j]<=0||j==i) continue;
				m[j]--;
				dfs(x+1);
				m[j]++;
			}
			for(int j=1;j<=13;j++){
				if(m[j]<=1||j==i)continue;
				m[j]-=2;
				dfs(x+1);
				m[j]+=2;
			}
			m[i]+=3;
		} 
		else{
			m[i]-=3;
			for(int j=1;j<=14;j++){
				if(m[j]<=0||j==i) continue;
				m[j]--;
				dfs(x+1);
				m[j]++;
			}
			for(int j=1;j<=13;j++){
				if(m[j]<=1||j==i) continue;
				m[j]-=2;
				dfs(x+1);
				m[j]+=2;
			}
			m[i]+=3;
			m[i]-=4; 
			for(int j=1;j<=14;j++){
				if(m[j]<=0||j==i) continue;
				m[j]--;
				for (int k=1;k<=14;k++){
					if(m[k]<=0||j==k) continue;
					m[k]--;
					dfs(x+1);
					m[k]++;
				}
				m[j]++;
			}
			for(int j=1;j<=13;j++){
				if(m[j]<=1||j==i) continue;
				m[j]-=2;
				for(int k=1;k<=13;k++) {
					if(m[k]<=1||j==k) continue;
					m[k]-=2;
					dfs(x+1);
					m[k]+=2;
				}
				m[j]+=2;
			}
			m[i]+=4;
		}
	}
	for(int i=1;i<=14;i++){
		if(m[i])s++;
	}
//	for(int i=1;i<=14;i++){
//		cout<<m[i]<<" ";
//	}cout<<endl<<s<<" "<<ans<<endl;
	ans=min(s,ans);
	return ;
}
int main(){
	cin>>T>>n;
	while(T--){
		ans=1e9+7;
		for(int i=1;i<=n;i++){
			cin>>x>>y;
			if(x==0)m[14]++;
			else if(x==1||x==2)m[x+11]++;
			else m[x-2]++;
		}
		dfs(0);
		cout<<ans<<endl;
		m.clear();
	}
	return 0;
}

第二个样例都过不去,但感觉好像没问题

2022/7/16 11:05
加载中...