让我们想一想,n划分成什么最优?
(首先一定要保证划分出来的数接近)
来暴搜枚举一下:
n=1:1=1 n=2:2=2 n=3:3=3 n=4:4=2*2 n=5:6=2*3 n=6:9=3*3 n=7:12=3*2*2 n=8:18=3*3*2 n=9:27=3*3*3 ......
都是2或3呢~
所以得到贪心数学策略:取3取到n<3或n=4
进一步:
if(n%3==0)ans=pow(3,n/3); if(n%3==1)ans=pow(3,n/3-1)*4 if(n%3==2)ans=pow(3,n/3)*2
所以有了30分代码:
#include<bits/stdc++.h> using namespace std; long long n; long long ans; int cmp; inline long long read(){ long long x=0,f=1; char c=getchar(); if(c=='-')f=-1; else x=x*10+c-'0'; c=getchar(); while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return x*f; } int main(){ n=read(); if(n%3==0)ans=pow(3,n/3); if(n%3==1)ans=pow(3,n/3-1)*4; if(n%3==2)ans=pow(3,n/3)*2; long long aans=ans; while(aans)aans/=10,cmp++; cout<<cmp<<endl; cout<<ans; return 0; }
???? 方法错了????
提示:在给定的范围内,最大乘积的位数不超过5000位。----by P4157[SCOI2006]整数划分
(眼瞎*1)
加高精~~
#include<bits/stdc++.h> using namespace std; long long n; int a[5010]; void mul(int x){ int q=0; for(int i=1;i<=a[0]+1;i++){ a[i]=a[i]*x+q; q=a[i]/10; a[i]%=10; } if(a[a[0]+1])a[0]++; } inline long long read(){ long long x=0,f=1; char c=getchar(); if(c=='-')f=-1; else x=x*10+c-'0'; c=getchar(); while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return x*f; } int main(){ cin>>n; a[0]=1,a[1]=1; if(n%3==0){ for(int i=1;i<=n/3;i++)mul(3); cout<<a[0]<<endl; for(int i=a[0];i>=1;i--)cout<<a[i]; return 0; } if(n%3==1){ for(int i=1;i<=n/3-1;i++)mul(3); mul(4); cout<<a[0]<<endl; for(int i=a[0];i>=1;i--)cout<<a[i]; return 0; } if(n%3==2){ for(int i=1;i<=n/3;i++)mul(3); mul(2); cout<<a[0]<<endl; for(int i=a[0];i>=1;i--)cout<<a[i]; return 0; } return 0; }
50???
第2行输出最大乘积的前100位,如果不足100位,则按实际位数输出最大乘积。----by P4157[SCOI2006]整数划分
(眼瞎*2)
再抢救一下吧……
#include<bits/stdc++.h> using namespace std; long long n; int a[5010]; void mul(int x){ int q=0; for(int i=1;i<=a[0]+1;i++){ a[i]=a[i]*x+q; q=a[i]/10; a[i]%=10; } if(a[a[0]+1])a[0]++; } inline long long read(){ long long x=0,f=1; char c=getchar(); if(c=='-')f=-1; else x=x*10+c-'0'; c=getchar(); while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return x*f; } int main(){ cin>>n; a[0]=1,a[1]=1; if(n%3==0){ for(int i=1;i<=n/3;i++)mul(3); cout<<a[0]<<endl; for(int i=a[0];i>=max(a[0]-99,1);i--)cout<<a[i]; return 0; } if(n%3==1){ for(int i=1;i<=n/3-1;i++)mul(3); mul(4); cout<<a[0]<<endl; for(int i=a[0];i>=max(a[0]-99,1);i--)cout<<a[i]; return 0; } if(n%3==2){ for(int i=1;i<=n/3;i++)mul(3); mul(2); cout<<a[0]<<endl; for(int i=a[0];i>=max(a[0]-99,1);i--)cout<<a[i]; return 0; } return 0; }
终于AC了