2020牛客多校赛第七场B Mask Allocation

题目链接
解题思路:
总体思路就是将开始的n*m转化到能凑成m*n
假设有n*m个物品,在总是保证n<=m前提下,先将物品分成n个m(因为能够取到的最少的组数就是n组),若此时n=m则此时即为结果,否则,就将这n个m变成n个n和n个(m-n),则此时所需要考虑的问题实质就是(n-m)*n的问题,重复上述操作直到分完物品。

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 100005;
int T,m,n,top;
int a[maxn];
int main()
{
    
    
	cin>>T;
	while(T--){
    
    
		cin>>n>>m;
		memset(a,0,sizeof(a));
		top = 0;
		if (n > m) swap(n,m);
		while(n){
    
    
			for (int i=1; i<=n; i++) a[++top] = n;
			int c = m-n;
			m = n; 
			n = c;
			if (n > m) swap(n,m);
		}
		cout<<top<<endl;
		for (int i=1; i<=top; i++) cout<<a[i]<<" ";
		cout<<endl;
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44063734/article/details/107863638