洛谷 P1010 冪次方
#include <bits/stdc++.h>
using namespace std;
int n,k,i,a[31];
void excel()
{
a[0]=1;
for(i=1;i<=30;i++)
a[i]=a[i-1]*2;
}
void f(int n)
{
while(n)
{
for(i=0;i<=30;i++)
if(a[i]>n){k=i-1;break;}//k表示2的冪次
n=n-a[k];//n被減到0時結束
if(k==0&&n>0)printf("2(0)+");//n>0說明不是末尾,則後面還有一個+號
if(k==0&&n==0)printf("2(0)");//n=0說明是末尾了,沒有+號
if(k==1&&n>0)printf("2+");
if(k==1&&n==0)printf("2");
if(k==2&&n>0)printf("2(2)+");
if(k==2&&n==0)printf("2(2)");
if(k>2)
{
printf("2(");
f(k);//對括號裏面的數也就是2的冪次進行分解
if(n>0)printf(")+");//分解到了末尾,有+號
else printf(")");//否則沒+號
}
}
}
int main()
{
excel();cin>>n;f(n);
return 0;
}
nefu 1759 數字分段-遞歸
不用遞歸也可。
#include <bits/stdc++.h>
using namespace std;
int n,k,i,sum,cnt1,cnt2,a[101],ans1[101],ans2[101];
int main()
{
cin>>n>>k;
for(i=1;i<=n;i++)
cin>>a[i];
cnt1=cnt2=sum=0;
ans2[++cnt2]=n;//ans2記錄右端點,逆序搜索,第一個右端點爲n
for(i=n;i>=1;i--)//逆序遍歷
{
sum=sum+a[i];
if(sum>k)
{sum=a[i];ans1[++cnt1]=i+1;ans2[++cnt2]=i;}
}
ans1[++cnt1]=1;//ans1記錄左端點,逆序搜索,最後一個左端點爲1
for(i=cnt1;i>=1;i--)//因爲是逆序搜索左右端點,所以要逆序輸出答案
printf("%d %d\n",ans1[i],ans2[i]);
return 0;
}