2020牛客暑期多校训练营(第七场)第二题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("");
}
}