样例数据分析:
水深9米,探测器在水下1米处,
字符u代表向上1米,探测器上浮到0米处
字符d代表向下1米,探测器下沉到1米处
字符u代表向上1米,探测器上浮到0米处
字符u代表向上1米,探测器已经在水面,不能上浮,依然在0米处
字符d代表向下1米,探测器下沉到1米处
字符d代表向下1米,探测器下沉到2米处
最终结果为2
考察知识:
基础语法,字符串,循环,条件判断
参考代码:
#include
using namespace std;
int main(){
int h,s;
string str;
cin>>h>>s>>str;
for(int i=0;i<str.size();i++){
if(str[i]=='u'){
if(s>0){
s--;
}
}else{
if(s<h){
s++;
}
}
}
cout<<s;
}
//蓝桥杯组委会:16601195122 田老师
//作者:17704313221 宫老师
//[明创科技教育](http://www.jilinmingchuang.com)
//[测评练习系统](http://oj.jilinmingchuang.com)
样例数据分析:
第一行数据 5 ,代表一共5站
第二行数据6 3 代表本站购买鱼6元,运费3元,第一站必须一定先购买一条 总花费6元
第三行数据7 1 代表本站购买鱼7元,运费1元,从上一站最小花费+运费9元,大于本站购买的费用7,所以选择从本站购买鱼,总花费 6+7=13元
第四行数据3 2 代表本站购买鱼3元,运费2元,从上一站最小花费+运费8元,大于本站购买的费用3,所以选择从本站购买鱼,总花费 6+7+3=16元
第五行数据8 3 代表本站购买鱼8元,运费3元,从上一站最小花费+运费5元,小于本站购买的费用8,所以选择从上一站花费加上本站运费,总花费6+7+3+5=21元
第六行数据9 5 代表本站购买鱼9元 运费5元,从上一站最小花费+运费8元,小于本站购买的费用9,所以选择从上一站花费加上本站运费,总花费6+7+3+5+8=29元
最终总花费为29元
考察知识:
数组,递推算法
参考代码:
#include
using namespace std;
int main(){
int n;
cin>>n;
int a[n],b[n];
for(int i=0;i<n;i++){
cin>>a[i]>>b[i];
}
int min=99999,t=0;
for(int i=0;i<n;i++){
if(min>a[i]){
min=a[i];
}
t=t+min;
min=min+b[i];
}
cout<<t;
}
//蓝桥杯组委会:16601195122 田老师
//作者:17704313221 宫老师
//[明创科技教育](http://www.jilinmingchuang.com)
//[测评练习系统](http://oj.jilinmingchuang.com)
第一轮投票,3个评委优先选择1号品牌,1个评委选择2号品牌,品牌3得票最少,淘汰掉
第二轮投票,3个评委优先选择1号品牌,1个评委选择2号品牌,品牌2得票最少,淘汰掉,淘汰2号品牌后,只剩一个1号品牌,1号品牌胜出
最终结果 1
第一轮投票,2个评委选择2号品牌,两个评委选择3号品牌,1号得票最少,淘汰掉
第二轮投票,2个评委选择2号品牌,两个评委选择3号品牌,由于只剩下两个品牌,且并列最少,都是2票,代表评选失败,需要输出最后一轮票数2的相反数-2
最终结果 -2
考察知识:
字符串,桶排序,模拟算法
参考代码:
#include
using namespace std;
int main(){
int m,n;
cin>>m>>n;
string str[n+1];
for(int i=1;i<=n;i++){
cin>>str[i];
}
int a[m+1];//记录投票过程,-1代表淘汰
while(true){
for(int i=1;i<=m;i++){
//重新计票,所有没有被淘汰的票数归零
if(a[i]!=-1)a[i]=0;
}
for(int i=1;i<=n;i++){
//计票
string s=str[i];
for(int j=0;j<s.size();j++){
char t=s[j]-'0';
if(t==0){
//如果为0 说明弃权
break;
}else{
//不为0,则代表要给t投票,如果t没有被淘汰则给它投票
if(a[t]>=0){
a[t]=a[t]+1;
break;
}
}
}
}
int min=m+1;
int max=0;
for(int i=1;i<=m;i++){
if(a[i]>=0){
if(min>a[i]) min=a[i];
if(max<a[i])max=a[i];
}
}
if(max>min){
//最大值比最小值大,需要将所有最小值的淘汰
for(int i=1;i<=m;i++){
if(a[i]==min)a[i]=-1;
}
}else{
//最大值和最小值相等说明平票
int count=0;
int dx=0;
for(int i=1;i<=m;i++){
if(a[i]==max){
count++;
dx=i;
}
}
if(count>1){
//如果数量多,说明评选失败
cout<<0-max;
}else{
cout<<dx;
}
break;
}
}
cin>>m;
}
//蓝桥杯组委会:16601195122 田老师
//作者:17704313221 宫老师
//[明创科技教育](http://www.jilinmingchuang.com)
//[测评练习系统](http://oj.jilinmingchuang.com)
样例数据分析:
第一行数据 10 9 4,代表最多能提起重量10,购物袋体积9,4种商品
第二行数据代表 第1件商品重量8 ,体积3,让利金额4
第三行数据代表 第2件商品重量5 ,体积4,让利金额5
第四行数据代表 第3件商品重量3 ,体积7,让利金额7
第五行数据代表 第4件商品重量4 ,体积5,让利金额4
创建一个三维数组 yh[n+1][w+1][v+1] 记录在第n个物品,w重量,v体积时 最优策略
则
只考虑一个物品的时候(纵向代表重量,横向代表体积,数据代表最大优惠)
考虑前两个物品的时候
考虑前三个物品的时候
考虑前四个物品的时候
最终结果,最大优惠为9,同时需要额外记录在在不同商品数量,不同重量和体积的情况下,如何购买商品
考察知识:
动态规划,二维费用的背包问题,在01背包问题的基础上增加一个费用维度
状态转移方程:
yh[i][j][k]=max(yh[i-1][j][k],yh[i-1][j-w[i]][k-v[i]]+n[i])
经典01背包问题解(https://blog.csdn.net/qq_38410730/article/details/81667885)
参考代码:
#include
using namespace std;
int main(){
int w,v,n;
cin>>w>>v>>n;
int a[n+1],b[n+1],c[n+1];
int yh[n+1][w+1][v+1];
string s[n+1][w+1][v+1];
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
for(int i=0;i<=n;i++){
for(int j=0;j<=w;j++){
for(int k=0;k<=v;k++){
yh[i][j][k]=0;
s[i][j][k]="";
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=w;j++){
for(int k=1;k<=v;k++){
int bn=yh[i-1][j][k];
int n=0;
if(j>=a[i]&&k>=b[i]){//重量和体积够的时候,尝试拿当前物品
n=yh[i-1][j-a[i]][k-b[i]]+c[i];
}
if(n>bn){//如果拿了比不拿价值大,就拿这个物品
yh[i][j][k]=n;
//同时记录拿了这个物品
s[i][j][k]=s[i-1][j-a[i]][k-b[i]]+" "+(char)(i+'0');
}else{
//否则记录当前重量和体积的最优策略是不拿
yh[i][j][k]=bn;
//同时记录不拿当前物品,保持和之前一样的物品列表
s[i][j][k]=s[i-1][j][k];
}
//printf("%d %d %d %d %d ",i,j,k,n,bn);
//cout<
}
}
//cin>>a[0];
}
cout<<yh[n][w][v]<<endl;
string str=s[n][w][v];
cout<<str.substr(1,str.size()-1);
}
//蓝桥杯组委会:16601195122 田老师
//作者:17704313221 宫老师
//[明创科技教育](http://www.jilinmingchuang.com)
//[测评练习系统](http://oj.jilinmingchuang.com)
样例数据分析:
第1步,寻找L
LSB
QBQ
BSL
第2步,在L的上下左右寻找Q
LSB
QBQ
BSL
第3步,在Q的上下左右寻找B
LSB
QBQ
BSL
第4步,在B的上下左右寻找S
LSB
QBQ
BSL
如此当重复到10次的时候,仍可以继续走,代表进入无限循环
因为3行3列最多9个格子,能走10步就代表一定进入无限循环
输出-1
第1步,寻找起点L
BLQB
BBQS
SBQL
QQQQ
第2步,在L的上下左右寻找Q
BLQB
BBQS
SBQL
QQQQ
第3步,在Q的上下左右寻找B
BLQB
BBQS
SBQL
QQQQ
第4步,在B的上下左右寻找S
BLQB
BBQS
SBQL
QQQQ
第5步,在S的上下左右寻找L
BLQB
BBQS
SBQL
QQQQ
第6步,在L的上下左右寻找Q
BLQB
BBQS
SBQL
QQQQ
第7步,在Q的上下左右寻找B
BLQB
BBQS
SBQL
QQQQ
第8步,在B的上下左右寻找S
BLQB
BBQS
SBQL
QQQQ
第9步,在S的上下左右寻找L
因为找不到L了,则代表迷宫走到尽头,一共走了8步,LQBS一共4个字符,所以走了
8/4=2共计2次LQBS,输出2
考察知识:
搜索与回朔
由于笔者的学员暂时未学到搜索与回朔算法,所以采用循环遍历类似穷举算法进行题解
参考代码:
#include
using namespace std;
int main(){
int n,m;
cin>>n>>m;
char map[n+1][m+1];
int path[n+1][m+1];
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int j=1;j<=m;j++){
map[i][j]=s[j-1];
path[i][j]=0;
if(map[i][j]=='L'){
path[i][j]=1;
}
}
}
string LQBS="LQBS";
int now=1;
while(true){
int flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(path[i][j]==now){
if(map[i][j-1]==LQBS[now%4]){
path[i][j-1]=now+1;
flag++;
}
if(map[i][j+1]==LQBS[now%4]){
path[i][j+1]=now+1;
flag++;
}
if(map[i-1][j]==LQBS[now%4]){
path[i-1][j]=now+1;
flag++;
}
if(map[i+1][j]==LQBS[now%4]){
path[i+1][j]=now+1;
flag++;
}
}
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<
if(flag==0){
break;
}
if(now>(n+1)*(m+1)){
break;
}
now++;
}
if(now>(n+1)*(m+1)){
cout<<-1;
}else{
cout<<now/4;
}
cin>>n;
}
//蓝桥杯组委会:16601195122 田老师
//作者:17704313221 宫老师
//[明创科技教育](http://www.jilinmingchuang.com)
//[测评练习系统](http://oj.jilinmingchuang.com)