首页 > 其他分享 >CSP历年复赛题-P1095 [NOIP2007 普及组] 守望者的逃离

CSP历年复赛题-P1095 [NOIP2007 普及组] 守望者的逃离

时间:2024-05-26 18:23:58浏览次数:27  
标签:10 NOIP2007 int 60 守望者 P1095 跑步 dist1 闪烁

原题链接:https://www.luogu.com.cn/problem/P1095

题意解读:在有限的时间内,通过跑步或者闪烁两种方式,能跑出的最远距离是多少,以及是否能跑出出口。

解题思路:

1、贪心法

每一秒钟,都有两种选择:跑步(17米)、闪烁(60米,前提是蓝够10点,否则等待1s恢复4点蓝)

经过计算,恢复足够的蓝到闪烁需要3.5s,而3.5s跑步可以跑出59.5

因此,在时间充分的情况下,闪烁以及等待回蓝是最佳方案,但是在最后的几秒,跑步才是更佳!

所以,可以枚举每一秒,跑步、闪烁两种方式同步进行,计算各自前进的距离,下一秒跑步的距离要以之前两种方案跑出最远的距离为基准(闪烁跑得远就用闪烁,否则就跑步)

100分代码:

#include <bits/stdc++.h>
using namespace std;

int m, s, t;
int dist1; //跑步的距离
int dist2; //闪烁的距离

int main()
{
    cin >> m >> s >> t;
    for(int i = 1; i <= t; i++)
    {
        dist1 += 17; //跑步方式
        if(m >= 10) //闪烁方式
        { 
            dist2 += 60;
            m -= 10;
        }
        else
        {
            m += 4;
        }
        dist1 = max(dist1, dist2); //如果这一秒闪烁更远,跑步方式就改成闪烁

        if(dist1 >= s)
        {
            cout << "Yes\n" << i;
            return 0;
        } 
    }
    cout << "No\n" << dist1;
    return 0;
}

2、动态规划

状态表示:f[i]表示经过i秒能跑出的最大距离

状态转移:

  如果是闪烁:

    蓝够:f[i] = f[i-1] + 60,蓝减10

    蓝不够:f[i] = f[i-1],蓝加4

  如果是跑步:

    f[i] = f[i - 1] + 17

可以第一轮枚举时间使用闪烁跑一遍,再枚举一遍时间用跑步补充,比较两者谁更有

  f[i] = max(f[i],f[i-1] + 17)

初始化:f[0] = 0

结果:第一个f[i] > s,如果没有最远距离就是f[t]

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 300005;
int m, s, t;
int f[N]; //f[i]为前i秒最多跑出的距离

int main()
{
    cin >> m >> s >> t;
    for(int i = 1; i <= t; i++)
    {
        if(m >= 10) f[i] = f[i-1] + 60, m -= 10;
        else f[i] = f[i-1], m += 4;
    }
    for(int i = 1; i <= t; i++)
    {
        f[i] = max(f[i], f[i-1] + 17);
    }
    for(int i = 1; i <= t; i++)
    {
        if(f[i] >= s)
        {
            cout << "Yes\n" << i;
            return 0;
        }
    }
    cout << "No\n" << f[t];
    return 0;
}

 

标签:10,NOIP2007,int,60,守望者,P1095,跑步,dist1,闪烁
From: https://www.cnblogs.com/jcwy/p/18214083

相关文章

  • CSP历年复赛题-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先一大、一小,如果价格之和不超限,则分为一组,如果超限,则大的单独分为一组,重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格不是和最......
  • 洛谷P1097 [NOIP2007 提高组] 统计数字
    #先看题目题目描述某次科研调查时得到了n 个自然数,每个数均不超过1.5×109。已知不相同的数不超过 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。输入格式共n+1 行。第一行是整数n,表示自然数的个数;第 2至n+1 每行一个自......
  • 洛谷题单指南-贪心-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先选择价格大的一直到超过分组价格上限,再选择价格小的直到超过价格上限,此为一组重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格......
  • P1093 [NOIP2007 普及组] 奖学金
    1.题目介绍[NOIP2007普及组]奖学金题目背景NOIP2007普及组T1题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前\(5\)名学生发奖学金。期末,每个学生都有\(3\)门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩......
  • 洛谷题单指南-排序-P1093 [NOIP2007 普及组] 奖学金
    原题链接:https://www.luogu.com.cn/problem/P1093题意解读:本题考察排序,根据题意,先按总分从大到小排,再按语文从大到小排,以上都相同则按学号从小到大排。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=305;structstudent{intid;intyuw......
  • 洛谷题单指南-模拟和高精度-P1098 [NOIP2007 提高组] 字符串的展开
    原题链接:https://www.luogu.com.cn/problem/P1098题意解读:题目本身是一道模拟题,但是细节点较多,要拿100分,有以下注意点:1、-号两个需要同时为小写字母或者数字,才进行填充2、-号左边>=右边,直接输出-3、对待填充的内容的处理,可以先看是否填充*;小写字母和数字的填充都是前一位asci......
  • [NOIP2007 普及组] 守望者的逃离
    [NOIP2007普及组]守望者的逃离题目背景NOIP2007普及组T3题目描述恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛......
  • 【洛谷 P1093】[NOIP2007 普及组] 奖学金 题解(结构体排序)
    [NOIP2007普及组]奖学金题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前名学生发奖学金。期末,每个学生都有门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规......
  • P1098 [NOIP2007 提高组] 字符串的展开(总结)
    P1098[NOIP2007提高组]字符串的展开http://ww.luogu.com.cn/problem/P1098注意字符中的数字是默认小于字母的。所以要对数字做特判。#include<iostream>#include<string>usingnamespacestd;intmain(){ intp1,p2,p3; cin>>p1>>p2>>p3; strings; cin......
  • AcWing 431. 守望者的逃离
    \(AcWing\)\(431\).守望者的逃离一、题目描述恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会......