lightoj 1189 水題叫你明白什麼叫貪心....

把一個數分解成階乘之和。 這個數小於10^18。10^18次方要用longlong來存。這樣的話,0到19的階乘總共是20個數 2^20 次方種狀態,是不能直接算組合的

這時候我還正是卡住了。

這道小水題告訴你的就是,當你不能直接搞的時候,就想想其他的策略,最簡單的就是貪心。

這個題中要是貪心的話肯定是從大往小了找,但是這樣會不會丟失正確答案呢?

因爲是階乘 所以,n!> (n-1)!+(n-2)!+..+0! 指數增長的都是這樣 最熟悉的 2^n=2^n-1+2^n-2+。。。。+2^1+2^0 +1

所以一定要從大的開始取,所以這個題就可以解決了。

#include<stdio.h>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;

ll fac[21];
int main()
{
	int cas;
	fac[0]=1;
	for(int i=1;i<20;i++)
		fac[i]=fac[i-1]*i;
	scanf("%d",&cas);
	
	for(int T=1;T<=cas;T++)
	{
		ll sum;
		scanf("%lld",&sum);
		vector<int> ans;
		for(int i=19;i>=0;i--)
		{
			if(sum-fac[i]>=0)
			{
				ans.push_back(i);
				sum-=fac[i];
				if(sum==0)
				{
					break;
				}
			}
		}
		printf("Case %d: ",T);
		if(sum!=0)
		{
			printf("impossible\n");
		}
		else
		{
			for(int j=ans.size()-1;j>=0;j--)
			{
				if(j!=0)
					printf("%d!+",ans[j]);
				else
					printf("%d!\n",ans[j]);
			}
		}
	}
	return 0;
}請問
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章