这道题的神奇题解

公交换乘

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

相关推荐

05-12 10:10
已编辑
门头沟学院 人工智能
写这篇之前我犹豫了挺久。一方面是怕被人骂,&quot;又一个收割焦虑的转行帖&quot;;另一方面是看了太多用&nbsp;GPT&nbsp;套娃出来的「学习路线」文章,AI&nbsp;味重得让人没法读完。所以这篇全是亲身踩过的坑,时间线、用过的项目、当时的心路全都尽量原样写出来。如果你是大学生在迷茫要不要转&nbsp;AI,或者已经在转的路上,希望能给点参考。&nbsp;一个反共识的开场:你以为进&nbsp;OpenAI&nbsp;的人都是博士?&nbsp;先讲个故事,跟我没关系,但跟所有想转&nbsp;AI&nbsp;的人都有关系。&nbsp;OpenAI&nbsp;的&nbsp;Sora&nbsp;团队(就是搞文生视频那个)一共&nbsp;13&nbsp;个人。这里面有两个人特别有意思:&nbsp;Will&nbsp;DePue,密歇根大学计算机系,直接辍学了。17...
_hengheng:我也本,也算是做ai相关,我最开始感觉做ai工程师有多么多么困难,后来发现懂了原理后整体训练完全可以看成一个流程化的内容,开源方案太多了,大多基本都是按着模子在自家业务上做各种操作,就算是大厂的小部门也没那么多资源去训基模,反而更多的是像怎么把技术往业务方向靠近了,不过当前时代如果本科学历没那么好加上自己执行力不是特别强还真不建议走ai工程师这条路,可以试试其他ai的偏业务方向,不然校招不太好杀出来
点赞 评论 收藏
分享
03-28 16:43
佛山大学 Java
java全国可飞:简历2.0,各位佬看看,这样可以吗查看图片
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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