4,5TLE 求大佬优化

P1025 [NOIP2001 提高组] 数的划分

编译通过的,给你做参考。时间超出,就是分大数的时候不仔细。 ```cpp #include<iostream> using namespace std; int count=0; //以7分3份为例 //有七个球 【 0 0 0 0 0 0 0 】 //向这些球中间插入两根棍子,分割这些球,例如 【 0 0 0 0 | 0 0 | 0 】这样就分成了4+2+1 //为了保证【4|2|1】不和【1|2|4】重复,只需要保证大数一定在前面 //给棍子插入的位置做编号【 0 (1) 0 (2) 0 (3) 0 (4) 0 (5) 0 (6) 0 】,共有(6)个位置可以插入 //但是因为要保证大数在前,第一根棍子不可以插入(1)位置 //这是因为 7分3,平均数是2.333,那么第一位数必须是2.333向上取整,即第一根棍子的位置>=3。(如果平均数==2,则>=2) //同样地,在确定第一根棍子的位置后,第二根棍子的位置也必须从【剩余长度/(剩余棍子数+1)】开始向上取整 //LastLen上个数的长度,RemainLen剩余数的长度,ReaminStic剩余棍子数,每根棍子分割一次剩余数 void fun(int const LastLen,int const RemainLen,int const RemainStick){ //棍子用完,一次分割完成 if(RemainStick==0){ count++; return; } if(LastLen==0){//LastLen==0表示这是第一根棍子 int i=RemainLen/(RemainStick+1);//如果将剩余的数等分,那么第一位数一定大于等于这个平均数 if(RemainLen%(RemainStick+1)!=0) i++;//如果余数不为零,表示等分失败,第一位数肯定大于平均数 for(;i<RemainLen;i++){ fun(i,RemainLen-i,RemainStick-1); } } else{ int i=RemainLen/(RemainStick+1); if(RemainLen%(RemainStick+1)!=0) i++; for(;i<RemainLen && i<=LastLen;i++){ fun(i,RemainLen-i,RemainStick-1); } } } //将整数n分成k份 //大数始终在前 int main(){ int n,k; cin>>n>>k; if(n<k){ cout<<"NO SOLUTION"<<endl; return 0; }else if(k==1){ cout<<1<<endl; return 0; } fun(0,n,k-1); cout<<count<<endl; } ```
by XianZai @ 2024-05-09 10:32:44


@[XianZai](/user/1346964) 好的,感谢!
by spessert @ 2024-05-09 18:28:36


|