让我们想一想,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了



京公网安备 11010502036488号