2020牛客暑期多校训练营(第七场)第二题Mask Allocation(递归)

2020牛客暑期多校训练营(第七场)第二题Mask Allocation(递归)

Mask Allocation

题意:给一个n与一个m,口罩总数为n * m,将口罩放入k个盒子,要求能取出n个m和m个n。

题解:很明显对于n和m,m若是较小的数,明显可以用m个盒子装m个口罩,并且m个口罩是n个m的最小要求,所以必然最优,剩下(n * m - m * m)需要完成取出(n - m)个m,m个(n - m)既可,问题就从n,m转移到了n-m,m,即一个递归既可完成,类似gcd的一个递归;

#include<iostream>
#include<vector>
using namespace std;
int t,t1,n,m,cnt;
vector<pair<int,int>>ans;
void gcd(int n,int m,int sum){
	if(n<m)swap(n,m);
	if(m==0){
		cnt+=(sum/n);
		ans.push_back({n,sum/n});
		return;
	}
	t1=n/m;
	ans.push_back({m,m*t1});
	sum-=m*m*t1;
	cnt+=m*t1;
	if(sum!=0)gcd(m,n%m,sum);
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		cnt=0;
		ans.clear();
		if(n<m)swap(n,m);
		gcd(n,m,n*m);
		printf("%d
",cnt);
		for(int i=0;i<ans.size();i++){
			for(int j=0;j<ans[i].second;j++){
				printf("%d ",ans[i].first);
			}
		}
		puts("");
	}
}

原文地址:https://www.cnblogs.com/whitelily/p/13418042.html