解题思路:

利用贪心的思想,每一步有两种选择,把这两种选择的结果都算出来,选最优的选择,每一步都选最优的选择
(我是参考Newguy_同学的思路,不过用c实现

注意事项:

参考代码:

#include<stdio.h>

//贪心思想,每走一步,都有两种选择,flash或者跑,每次都选择可以逃得更远的那种 

int main()

{

int M,S,t,i=0;

int flash=0,sum=0;//flash记录可以如果某一步选“闪”,能逃多远;sum先记录如果自己跑,能逃多远,然后和flash比较,最后取能逃得更远的那个数 

scanf("%d%d%d",&M,&S,&t);

for(i=1;i<=t;i++)//将闪移和跑步分卡考虑,优先考虑闪移(因为魔法够的话,显然“闪”比较快) 

{

if(M>=10)//魔法点数大于10,就“闪” 

{

flash=flash+60;

M=M-10;

}

else//否则休息,加魔法点 

M=M+4;

sum=sum+17;//如果这一步选自己跑,能跑多远 

if(sum<flash)//最终sum存储这一步的最优选择 

sum=flash;

if(sum>=S)

{

printf("Yes\n%d",i);

break;

}

}

if(i>t)

{

printf("No\n");

printf("%d\n",sum);

}

return 0;

}


点赞(1)
 

0.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 6 条评论

dotcpp0632515 2年前 回复TA
@性傻在答 哪里
人海浮沉 3年前 回复TA
t老师牛逼
扣脚的菜鸟 3年前 回复TA
谢谢大佬分享
性傻在答 6年前 回复TA
@性傻在答 知道错了
性傻在答 6年前 回复TA
@性傻在答 #include <stdio.h>   int main() {  long m=0,s=0,t=0;  long es=0,et=0;  scanf("%ld %ld %ld",&m,&s,&t);  //第一阶段  while(m>=10){      es=es+60;      et=et+1;      m=m-10;  }  //二阶  while(s-es>120){      while(m<10){          et++;          m=m+4;      }      m=m-10;      es=es+60;  }  while(s-es<120 && s-es>60){      if(m>=2){              while(m<10){              et++;              m=m+4;          }           m=m-10;          es=es+60;      }      else if(m<2){              while (s-es>60){                  et++;                  es=es+17;              }      }  }  //int ss=0;  //ss=s-es;  while(s-es>0){      et++;      es=es+17;  }  if(et<=t){      printf("Yes\n");      printf("%ld",et);  }else {      printf("No\n");      while(et>t){          es=es-17;          et--;      }      printf("%ld",es);  } // printf("%d %d",et,es);     return 0; }不知道怎么错了
性傻在答 6年前 回复TA
#include <stdio.h>
 
int main()
{
 long m=0,s=0,t=0;
 long es=0,et=0;
 scanf("%ld %ld %ld",&m,&s,&t);
 //第一阶段
 while(m>=10){
     es=es+60;
     et=et+1;
     m=m-10;
 }
 //二阶
 while(s-es>120){
     while(m<10){
         et++;
         m=m+4;
     }
     m=m-10;
     es=es+60;
 }
 while(s-es<120 && s-es>60){
     if(m>=2){
             while(m<10){
             et++;
             m=m+4;
         } 
         m=m-10;
         es=es+60;
     }
     else if(m<2){
             while (s-es>60){
                 et++;
                 es=es+17;
             }
     }
 }
 //int ss=0;
 //ss=s-es;
 while