zoukankan      html  css  js  c++  java
  • 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("");
    	}
    }
    
    
  • 相关阅读:
    回眸
    随想
    小序,良感
    润思
    网络爬虫的 “ 黑洞 ”
    Python——文件操作详解
    RandomAccessFile详解
    JSON数据解析及gson.jar包
    BigInteger详解
    Java爬虫——B站弹幕爬取
  • 原文地址:https://www.cnblogs.com/whitelily/p/13418042.html
Copyright © 2011-2022 走看看