最后一个点WA,来个人帮忙看看
查看原帖
最后一个点WA,来个人帮忙看看
288782
痴人说梦wza楼主2022/2/16 17:21

最后一个点错了,采用贪心思路,成绩最大就把他拆成最多。比如 20 = 2+3+4+5+6 。

22 的话 2+3+4+5+6 缺2 , 就把2补在后面的5,6上 所以 22 = 2+3+4+6+7 。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1005;
struct bignum{
	int a[N],len;
	void init(){
		len=0;
		for(int i=1;i<=N;i++)
			a[i]=0;
	}
	bignum(){
		init();
	}
	bignum(int s){
		init();
		while(s!=0){
			a[++len]=s%10;
			s/=10;
		}
	}
	void show(){
		for(int i=len;i>=1;i--)
			cout<<a[i];
		cout<<endl;
	}
};

bignum operator * (bignum a,bignum b){
	bignum ans;
	ans.len=a.len+b.len-1;
	for(int i=1;i<=a.len;i++){
		for(int j=1;j<=b.len;j++){
			int k=i+j-1;
			ans.a[k]+=a.a[i]*b.a[j];
			ans.a[k+1]+=ans.a[k]/10;
			ans.a[k]=ans.a[k]%10;
		}
	}
	if(ans.a[ans.len+1]!=0)ans.len++;
	else if(ans.a[ans.len]==0)ans.len=1;
	return ans;
}
int main(){
	int n,len=1,a[10005];
	cin>>n;
	for(int i=2;;i++){
		if(n-i<=0) break;
		n-=i;
		a[len++]=i;
	}
	for(int i=1;i<=n;i++){
		a[len-i]++;
	}
	for(int i=1;i<=len-1;i++)
		cout<<a[i]<<' ';
	cout<<endl;
	bignum sum(1);
	for(int i=1;i<=len-1;i++){
		bignum b(a[i]);
		sum=sum*b;
	}		
	sum.show();
	return 0;
}
2022/2/16 17:21
加载中...