题目大意
将n∗m个口罩分成k份分给医院,使得从中挑出n组,每组口罩数量一样多,也可以从中挑出m组,每组一样多,最后输出字典序最大的。
解题思路
我们可以先将n,m互换(如果m<n),使得n<m。由于要求字典序最大,装口罩最多的盒子不超过n。
医院数量为n的时候,需要给每个医院安排m个口罩,至多给每个医院(m/n)个(向下取整)盒子,每个装着n个,总的就是(m/n)×n个盒子,每个医院还要再拿m%n个口罩。
这时候我们考虑医院数量为m的情况,此时需要给每个医院分配n个口罩,那显然已经有(m/n)×n个医院满足条件了,还有m%n个医院没拿到。
所以,这实现上就是个类似gcd的dfs么?具体看代码。
AC代码
#include<bits/stdc++.h> using namespace std; vector<int> ans; void dfs(int n,int m) { if(m==0) return; for(int i=0;i<(n/m)*m;i++) ans.push_back(m); dfs(max((n%m),m),min((n%m),m)); } int main() { int t,n,m,i; scanf("%d",&t); while(t--) { ans.clear(); scanf("%d%d",&n,&m); if(n<m) swap(n,m); dfs(max(n,m),min(n,m)); printf("%d\n",ans.size()); for(i=0;i<ans.size();i++) printf("%d ",ans[i]); puts(""); } return 0; }