求助
查看原帖
求助
781523
QGHappy_Fly楼主2023/9/12 15:47
#include<bitsdc++.h>
using namespace std;
int h[20],p[20];

/*
1 2 3 4 5 6 
2 3 2 2 1 4
*/
int threee(){
	int summ=0,cnt=0;
	for(int i=3;i<=15;i++){
		if(h[i]>=3){
			summ++;
		}else{
			if(summ>=2){
				for(int k=(i-summ);k<i;k++){
					h[k]-=3;
				}
				cnt++;
			}
			summ=0;
		}
	}
	return cnt;
}

int  twoo(){
	int summ=0,cnt=0;
	for(int i=3;i<=15;i++){
		if(h[i]>=2){
			summ++;
		}else{
			if(summ>=3){
				for(int k=(i-summ);k<i;k++){
					h[k]-=2;
				}
				cnt++;
			}
			summ=0;
		}
	}
	return cnt;
}

int onee(){
	int summ=0,cnt=0;
	for(int i=3;i<=15;i++){
		if(h[i]>=1){
			summ++;
		}else{
			if(summ>=5){
				for(int k=(i-summ);k<i;k++){
					h[k]--;
				}
				cnt++;
			}
			summ=0;
		}
	}
	return cnt;
}

int fourtwo(){
	int cnt=0,cntt=0;
	for(int i=1;i<=15;i++){
		if(h[i]==4){
			cntt=0;
			for(int j=0;j<=15;j++){
				if(cntt==2)break;
				if(h[j]==1&&cntt<2){
					cntt++;
					h[j]--;
				}
			}
			for(int j=0;j<=15;j++){
				if(cntt==2)break;
				if(h[j]==2&&cntt<2){
					cntt++;
					h[j]--;
				}
			}
			for(int j=0;j<=15;j++){
				if(cntt==2)break;
				if(h[j]==3&&cntt<2){
					cntt++;
					h[j]--;
				}
			}
			if(cntt==2){
				cnt++;
				h[i]-=4;
			}
		}
	}
	return cnt;
} 

int threetwo(){
	int cnt=0,cntt=0;
	for(int i=1;i<=15;i++){
		if(h[i]==3){
			cntt=0;
			for(int j=0;j<=15;j++){
				if(h[j]==1&&cntt<2){
					cntt++;
					h[j]--;
				}
			}
			for(int j=0;j<=15;j++){
				if(cntt==2)break;
				if(h[j]==2&&cntt<2){
					cntt++;
					h[j]--;
				}
			}
			for(int j=0;j<=15;j++){
				if(cntt==2)break;
				if(h[j]==3&&cntt<2){
					cntt++;
					h[j]--;
				}
			}
			if(cntt==2){
				cnt++;
				h[i]-=3;
			}
		}
	}
	return cnt;
} 

int threeone(){
	int cnt=0,cntt=0;
	for(int i=1;i<=15;i++){
		if(h[i]==3){
			cntt=0;
			for(int j=0;j<=15;j++){
				if(h[j]==1&&cntt<1){
					cntt++;
					h[j]--;
					cnt++;
					break;
				}
			}
			for(int j=0;j<=15;j++){
				if(cntt==1)break;
				if(h[j]==2&&cntt<1){
					cntt++;
					h[j]--;
					cnt++;
				}
			}
			for(int j=0;j<=15;j++){
				if(cntt==1)break;
				if(h[j]==3&&cntt<1){
					cntt++;
					h[j]--;
					cnt++;
				}
			}
			if(cntt==1){
				h[i]-=3;
			}
		}
	}
	return cnt;
} 

/*

 0 1 2 3 4 5 6 7 8 9 10 11 12 13
 1 0 0 0 0 0 0 0     2  1  0

2
*/ 

int v[7]={1};

int dfs(int k){
	int cnt=0,mm=1;
	for(int i=1;i<=6;i++){
		if(v[i]==0)mm=0;
	}
	if(mm==1){
//		for(int i=0;i<15;i++){
//			cout<<h[i]<<' ';
//		}
//		cout<<endl;
		return cnt;
	}
	if(k==1){
		cnt+=threee();
	}else if(k==2){
		cnt+=twoo();
	}else if(k==3){
		cnt+=onee();
	}else if(k==4){
		cnt+=fourtwo();
	}else if(k==5){
		cnt+=threetwo();
	}else if(k==6){
		cnt+=threeone();
	}
	for(int i=1;i<=6;i++){
		if(v[i]==0){
			v[i]=1;
			cnt+=dfs(i);
			v[i]=0;
			
		}
//		cout<<i<<endl;
	}
//	cout<<endl;
	return cnt;
}







int t,n;
int main(){
	
	cin>>t>>n;
	for(int i=0;i<t;i++){
		for(int j=0;j<=15;j++){
			p[j]=0;h[j]=0;
		}
		for(int j=0;j<n;j++){
			int a,b;
			cin>>a>>b;
			if(a==1||a==2){
				p[a+13]++;
			}else{
				p[a]++;
			}
		}
//		for(int i=0;i<15;i++){
//			cout<<h[i]<<' ';
//		}
//		cout<<endl;
		int minn=114514,summ;
		for(int i=1;i<=6;i++){
			for(int j=0;j<=15;j++){
				h[j]=p[j];
			}
			v[i]=1;
			summ+=dfs(i);
			v[i]=0;
			for(int j=0;j<=15;j++){
				if(h[j]!=0){
					summ++;
				}
			}
			minn=min(minn,summ);
		}
//		for(int i2=0;i2<-1;i2++){
//			cout<<"in"<<endl;
//		}
//		cout<<endl;
		if(i==0)cout<<minn;
		else cout<<endl<<minn; 
		
	}
	return 0;
}



1 17

12 3

4 3

2 3

5 4

10 2

3 3

12 2

0 1

1 3

10 1

6 2

12 1

11 3

5 2

12 4

2 2

7 2

输出7

答案6

但如果取消以下代码的注释:

for(int i2=0;i2<-1;i2++){
	cout<<"in"<<endl;
}

输出就变成了6

这是个什么原理啊?

2023/9/12 15:47
加载中...