【NOIP2018 模拟赛day1】塔

这道题思路容易想到,纯模拟不做任何优化可以得30分左右。但是如何去推公式就让人感到了迷茫?听到DB讲的也是一脸茫然?????????

总之是一道让人感到了绝望的题目.

推理在这里,我是真的不知道怎么推的

剩下的就看代码了:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

long long maxx=-1;
long long mark;

long long power(long long a){//快速幂求3次方
	
	long long ans=1;
	int b=3;
	
	while(b){
		if(b&1)
		ans=ans*a;
		
		a=a*a;
		
		b>>=1;
	}
	
	return ans;
}



void find(long long m,long long number,long long x)//m表示当前的体积,number表示当前用的积木的个数,x表示当前的自己选的体积?
{
	if(m==0)//如果已经搭完了
	{
		if(number>maxx||(number==maxx&&mark<x)){//判断是不是为最优解
			maxx=number;
			mark=x;
		}
		return;
	}
	long long a=pow(m,1.0/3);//算最大的边长
	find(m-power(a),number+1,x+power(a));//公式递归
	find(power(a)-1-power(a-1),number+1,x+power(a-1));
}

int main(){
	long long m;
	cin>>m;
	find(m,0,0);//一开始找的时候没有用积木,m没有减少,x也不知道,所以从初始的状态开始。
cout<<maxx<<" "<<mark;
}




31(a1)3=3a23a

猜你喜欢

转载自blog.csdn.net/qq_41734244/article/details/79851481