您的位置:首页 > 其它

蓝桥杯算法提高—种树问题

2015-08-03 08:35 274 查看
种树

问题描述

  A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门 得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤 肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。

  最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大。如果无法将m棵树苗全部种上,给出无解信息。

输入格式

  输入的第一行包含两个正整数n、m。

  第二行n个整数Ai。

输出格式

  输出一个整数,表示最佳植树方案可以得到的美观度。如果无解输出“Error!”,不包含引号。

样例输入

7 3

1 2 3 4 5 6 7

样例输出

15

样例输入

7 4

1 2 3 4 5 6 7

样例输出

Error!

数据规模和约定

  对于全部数据,满足1<=m<=n<=30;

  其中90%的数据满足m<=n<=20

  -1000<=Ai<=1000

典型的递归搜索题,这道题不怎么难,但是也让我做了半天,水平太渣= =!,然后找人调试好了。

这道题目就是用数组标记当前位置是否已选,搜索两种情况,选和不选,直到树全部种完!

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

using namespace std;

int N,M;

int str[50];

int F;

bool used[50];//标记当前位置是否种植了树

int solve(int x,int y)

{

if(y>0&&x>=N)//如果还剩下树没种,但搜索的位置已到尾端,就不合法

return -1;

int res=0;//定义最大鉴赏价值

if(y>=1&&x<N)//合法进入搜索

{

int x_1,x_2;

x_1=x_2=-1;

if(used[(x+1)%N])//判断下个位置是否被标记

{

used[x]=false;//当前位置被选进

x_1=solve(x+2,y-1);

used[x]=true;//或不选,还原标记

}

x_2=solve(x+1,y);//直接搜索下个位置

if(x_1!=-1&&res<x_1+str[x])//找最大的鉴赏价值

res=x_1+str[x];

if(x_2!=-1&&res<x_2)//搜索下个位置的最大鉴赏价值

res=x_2;

if(x_1==-1&&x_2==-1)//如果都非法,归还-1

res=-1;

}

return res;

}

int main()

{

while(scanf("%d%d",&N,&M)!=EOF)

{

for(int i=0; i<N; i++)

scanf("%d",&str[i]);

memset(used,true,sizeof(used));

if(N/2<M)//如果植入的树大于n/2,则必有相邻

printf("Error!\n");

else

cout<<solve(0,M)<<endl;//从零位置搜索

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: