这道题的神奇题解

公交换乘

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了。

总结:

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

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

相关推荐

像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
评论
2
收藏
分享
正在热议
# 25届秋招总结 #
442870次浏览 4513人参与
# 春招别灰心,我们一人来一句鼓励 #
42047次浏览 534人参与
# 阿里云管培生offer #
120333次浏览 2220人参与
# 地方国企笔面经互助 #
7969次浏览 18人参与
# 同bg的你秋招战况如何? #
76925次浏览 565人参与
# 实习必须要去大厂吗? #
55786次浏览 961人参与
# 北方华创开奖 #
107451次浏览 600人参与
# 虾皮求职进展汇总 #
115973次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11632次浏览 289人参与
# 实习,投递多份简历没人回复怎么办 #
2454828次浏览 34858人参与
# 提前批简历挂麻了怎么办 #
149917次浏览 1978人参与
# 在找工作求抱抱 #
906050次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4760次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1195992次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157640次浏览 2267人参与
# 双非本科求职如何逆袭 #
662310次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12786次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35857次浏览 384人参与
# 简历中的项目经历要怎么写? #
86928次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20142次浏览 240人参与
# 我的上岸简历长这样 #
452040次浏览 8089人参与
牛客网
牛客企业服务