蓝桥杯算法提高—种树问题
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;
}
问题描述
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;
}
相关文章推荐
- CDIO第三周总结
- iOS UI03_登陆+注册 UI1~3系统归纳
- 垃圾回收
- 属性( @property )与成员变量的那些事 :
- HDOJ~~A + B Problem II
- p1474
- ETO、MTO、ATO与MTS(按单设计、按单生产、按单装配和库存生产)
- unity的自动寻路之 ------ wayPoint寻路的实现方式
- HDU 3308 LCIS(线段树区间合并)
- Related Problems
- RecyclerView的高级用法——定制动画
- 郝斌视频学习笔记006
- Keil MDK5.15使用Jlink下载时出现Jlink clone版无法使用
- 【Nginx-反向代理服务器】基础知识(二)之多进程模式
- ABP(现代ASP.NET样板开发框架)系列之16、ABP应用层——数据传输对象(DTOs)
- 空格填充器(alignBySpace)
- 第14章 位图和位块传输_14.4 GDI位图对象(1)
- C语言简介
- HT for Web基础动画介绍
- day13