蓝桥杯练习——货物摆放


前言


练习。
提示:以下是本篇文章正文内容,下面案例可供参考

一、题目

题目描述
有n箱货物,长宽高的方向上分别堆L、W、H的货物,满足n=L×W×H。给定n=2021041820210418,总共有多少种堆放货物的方案?

这里,(1 1 2021041820210418)和(2021041820210418 1 1)是两种不同的方案。

二、思路

n = a b c n=abc n=abc,使用暴力枚举获得答案。
先看 n = 6 n=6 n=6
a a a有几种选择? a = 1 , 2 , 3 a=1,2,3 a=1,2,3即可以选择 n n n的因子。设 n n n c n t 1 cnt_1 cnt1个因子,则 a a a c n t 1 cnt_1 cnt1种选择。
a a a确定了之后, 有 b ∗ c = n / a b*c=n/a bc=n/a b b b有几种选择?可以选择 n / a n/a n/a的因子。设 n / a n/a n/a c n t 2 cnt_2 cnt2个因子,则 b b b c n t 2 cnt_2 cnt2种选择。
因此我们求出 n n n的因子以及 a a a确定后 n / a n/a n/a的因子, a , b , c a,b,c a,b,c就确定了一个情况。然后去个重就是答案。
因为是填空题,直接枚举 1 1 1 s q r t ( n ) sqrt(n) sqrt(n)求因子就好了。细节看代码(完全乱写 )。

代码

代码如下(示例):

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll n=2021041820210418;
ll primes[10007];
ll primes_b[10007];
int cnt_p;
int cnt_b;
map<string,int>vis;
void get_p(ll x){
	int i;
	for(i=1;i<=sqrt(x);i++){
		if(x%i==0){
			primes[++cnt_p]=i;
		}	
	}
	int bcnt=cnt_p;
	for(int i=bcnt;i>=1;i--){
		ll per=x/primes[i];
		primes[++cnt_p]=per;
	}
}
void get_pa(ll x){
	int i;
	for(i=1;i<=sqrt(x);i++){
		if(x%i==0){
			primes_b[++cnt_b]=i;
		}	
	}
	int bcnt=cnt_b;
	for(int i=bcnt;i>=1;i--){
		ll per=x/primes_b[i];
		primes_b[++cnt_b]=per;
	}
}
string itos(ll x){
	stringstream ss;
	string res;
	ss<<x;
	ss>>res;
	return res;
}
int main(){
	//求n的因子
	cnt_p=0;
	get_p(n); 
	ll i,j;
	ll ans=0;
	for(i=1;i<=cnt_p;i++){//枚举a 
		ll a=primes[i];
		cout<<"this is "<<a<<endl;
		cnt_b=0;
		get_pa(n/a);
		for(j=1;j<=cnt_b;j++){//枚举b 
			ll b=primes_b[j];
			ll c=n/a/b;
			//a_b_c
			string per="";
			per+=itos(a);
			per+=itos(b);
			per+=itos(c);
			//cout<<per<<endl;
			if(vis[per]==1){
				//cout<<"old\n";
				continue;
			}
			else{//新的 
				//cout<<"new!\n";
				vis[per]=1;
				ans++;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
} 

总结

m a p < s t r i n g , i n t > v i s map<string,int>vis map<string,int>vis也可以使用 m a p < n o d e , i n t > v i s map<node,int>vis map<node,int>vis代替,但是map是会自动排序的,使用自定义类型的时候,要告诉计算机你的类型怎么比较大小,否则会报错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值