这道题的神奇题解

公交换乘

https://ac.nowcoder.com/acm/problem/54632

博客入口在


想在此处看的就接着看吧。

这是一道水题

虽然说有点水,但是细节很多。感觉跟***差不多

细节:

1.优惠券生效的时间

优惠券生效的时间是45分钟,所以要记得加等号,不加难AC。

2.优惠券使用的顺序

优惠券是从早到晚使用,所以循环要从小到大走。

3.优惠券的生效对价钱的要求

优惠券是从地铁获得,如果要生效,必须使用在比这趟地铁的价格便宜的公交车费上。

4.优惠券的使用与否

如果只满足上述三点,也很难AC。如果不判断,还是会0分的。所以此处做个记忆化,记录哪些用了。因为这道题的数据范围很小,所以可以使用基数排序的方法来记录。


这些细节注意完后,代码大致如下:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int Maxn = 1e5;
struct Recode
{
    int By;//交通方式 
    int Prize;//价格 
    int Time;//时间点
}Re[Maxn];
int DaBiao[Maxn]; 
int main()
{
    int n;
    long long ans = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {

        scanf("%d %d %d", &Re[i].By, &Re[i].Prize, &Re[i].Time); 
        if(Re[i].By)//如果是公交车而且没被用过 
        {
            bool HP_SRC = false;
            for(int j = 1; j < i; j++)//寻找优惠券 
            {
                if(DaBiao[j])
                    continue; 
                else if(!Re[j].By && abs(Re[i].Time - Re[j].Time) <= 45 && Re[i].Prize <= Re[j].Prize)//如果有优惠券 
                {
                    HP_SRC = 1;
                    DaBiao[j] = 1;
                    break;
                }
            }
            if(!HP_SRC)
                ans += Re[i].Prize;
        }
        else
            ans += Re[i].Prize;

    }
    printf("%lld", ans);

    return 0;
}

当你将这个代码交上去时,会这样

也就是TLE几个点。吸过氧了,几乎什么都没有改变


这也就是我做这道题多用了1个多小时的细节。

我们可以看一下刚才那个代码的一个循环:for(int j = 1; j < i; j++)

如果认真读题的人当然没有我就会发现:开始的话到了后面大起来的时候就会很浪费时间,导致TLE

所以我们就可以参考队列,因为队列是一个( ,先进先出),符合题意。由于我们不取队头元素,所以我们只定义head(队尾我也不知道我怎么想的),然后去找有效的元素(时间差在45min内的)。改完的代码如下:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int Maxn = 1e5;
struct Recode
{
    int By;//交通方式 
    int Prize;//价格 
    int Time;//时间点
}Re[Maxn];
int DaBiao[Maxn];
int head = 1;
int main()
{
    int n;
    long long ans = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {

        scanf("%d %d %d", &Re[i].By, &Re[i].Prize, &Re[i].Time); 
        if(Re[i].By)//如果是公交车而且没被用过 
        {
            bool HP_SRC = false;
            for(int j = head; j < i; j++)//寻找优惠券 
            {
                if(Re[i].Time- Re[j].Time > 45)
                    head = j;
                if(DaBiao[j])
                    continue; 
                else if(!Re[j].By && abs(Re[i].Time - Re[j].Time) <= 45 && Re[i].Prize <= Re[j].Prize)//如果有优惠券 
                {
                    HP_SRC = 1;
                    DaBiao[j] = 1;
                    break;
                }
            }
            if(!HP_SRC)
                ans += Re[i].Prize;
        }
        else
            ans += Re[i].Prize;

    }
    printf("%lld\n", ans);

    return 0;
}

当然,你们不用去交,结果在
。AC了。

总结:

这道题虽然看起来水,但是细节很多。

全部评论
另外你的解法中,int DaBiao[Maxn],其实可以作为Recode的一个字段,没必要单独搞个数组。
点赞 回复 分享
发布于 2022-08-02 09:36
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=53040362 这题可以用环形数组/自制头尾链表/std:list/std:vector等解法都可以,我个人推荐std:vector,熟悉这玩意很多地方都用的上。
点赞 回复 分享
发布于 2022-08-02 09:32

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务