递归与分治(3)

一.输油管道问题
int n; //油井的数量
int x; //x坐标,读取后丢弃
int a[1000]; //y坐标
cin>>n;
for (int i=0; i<n; i++)
cin>>x>>a[i];
int y = select(0, n-1, n/2); //采用分治算法计算中位数。快速排序中的分割算法
//计算各油井到主管道之间的输油管道最小长度总和
int min=0;
for(int i=0;i<n;i++)
min += (int)fabs(a[i]-y);
cout<<min<<endl;
二.半数集问题
#include
using namespace std;
int a[100];
int comp(int n) {
int ans=1;
if(a[n]>0) return a[n];
for(int i=1;i<=n/2;i++) {
ans=ans+ comp(i);
}
a[n]=ans;
return ans;
}
int main() {
int x,num;
memset(a,0,sizeof(a));
cin>>x; num=comp(x); cout<<num<<endl; return 0;
}
三.整数因子分解
大于1的正整数n可以分解为:

当n=12时,共有8种不同的分解式:
对于给定的正整数n,编程计算n共有多少种不同的分解式。
int total; //定义为全局变量
void solve(int n) {
if (n1) total++; //获得一个分解
else for (int i=2; i<=n; i++)
if (n%i
0) solve(n/i);
}
//主函数main()中数据的读取与调用
int n;
while( cin>>n)
{
total = 0;
solve(n);
cout<<total;
}
四.黑白棋子的移动
数据结构如下:
数组c[1…max]用来作为棋子移动的场所,
初始时,
c[1]~c[n]存放白子(用字符o表示),
c[n+1]~c[2n]存放黑子(用字符表示),
c[2n+1],c[2n+2]为空位置(用字符—表示)。
最后结果在c[3]~c[2n+2]中。
#include
using namespace std;
int n,step,sp;
char c[101];
void init(int n) { //初始化
int i;
st=0;
sp=2
n+1;
for (i=1;i<=n;i++)
c[i]=‘o’;
for (i=n+1;i<=2n;i++)
c[i]=’
’;
c[2n+1]=’-’;c[2n+2]=’-’;
print();
}
void print(){ //打印
int i;
cout<<"step "<<step<<’:’;
for (i=1;i<=2n+2;i++)
cout<<c[i];
cout<<endl;
step++;
}
void mv(int n) { //主要过程
int i,k;
if (n==4) { //n等于4的情况要特殊处理
move(4);
move(8);
move(2);
move(7);
move(1);
}
else {
move(n);
move(2
n-1);
mv(n-1);
}
}
int main(){
cin>>n;
init(n);
mv(n);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值