CSP-J第二轮试题-2019年-1、2题

news2024/11/18 23:49:19

文章目录

    • 参考:
    • 总结
  • [CSP-J2019] 数字游戏
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
    • 答案
    • 答案2
  • [CSP-J 2019] 公交换乘
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
    • 答案1
    • 答案2
  • 现场真题注意事项

在这里插入图片描述

参考:

https://www.luogu.com.cn/problem/P5660
https://www.luogu.com.cn/problem/P5661

总结

本系列为CSP-J/S算法竞赛真题讲解,会按照年份分析每年的真题,并给出对应的答案。本文为2019年真题。
https://www.luogu.com.cn/problem/list?tag=343&page=1

[CSP-J2019] 数字游戏

题目描述

小 K 同学向小 P 同学发送了一个长度为 8 8 801 字符串来玩数字游戏,小 P 同学想要知道字符串中究竟有多少个 1 1 1

注意:01 字符串为每一个字符是 0 0 0 或者 1 1 1 的字符串,如“101”(不含双引号)为一个长度为 3 3 3 的 01 字符串。

输入格式

输入文件只有一行,一个长度为 8 8 8 的 01 字符串 s s s

输出格式

输出文件只有一行,包含一个整数,即 01 字符串中字符 1 \bm 1 1 的个数。

样例 #1

样例输入 #1

00010100

样例输出 #1

2

样例 #2

样例输入 #2

11111111

样例输出 #2

8

提示

【输入输出样例 1 说明】

该 01 字符串中有 2 2 2 个字符 1 1 1

【输入输出样例 2 说明】

该 01 字符串中有 8 8 8 个字符 1 1 1

【数据规模与约定】

  • 对于 20 % 20\% 20% 的数据,保证输入的字符全部为 0 0 0
  • 对于 100 % 100\% 100% 的数据,输入只可能包含字符 0 0 0 和字符 1 1 1,字符串长度固定为 8 8 8

答案

//#include <bits/stdc++.h>
#include<cstdio>//必须包含cstdio头文件
using namespace std;


int main(){
	//freopen("candy.in","r",stdin);
	//freopen("candy.out","w",stdout);
    char x;
    int ans=0;
    for(int i=1;i<=8;i++)
    {
        scanf("%c",&x);
        if(x=='1')
            ans++;
    }
    printf("%d\n",ans);
    return 0;
}

输出:
在这里插入图片描述

答案2

#include<iostream>
using namespace std;
int ans=0;//ans计数器
char s[21];//字符串开大一点
int main(){
	cin>>s;
	for(int i=0;i<8;i++){//模拟
		if(s[i]=='1'){//判断是否为1
			ans++;//计数器++
		}
	}
	cout<<ans<<endl;
	return 0;//完美结束
}

输出为:
在这里插入图片描述

[CSP-J 2019] 公交换乘

题目描述

著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:

  1. 在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,即:
    t b u s − t s u b w a y ≤ 45 t_{bus} - t_{subway} \leq 45 tbustsubway45
  2. 搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。
  3. 搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。

现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?

输入格式

输入文件的第一行包含一个正整数 n n n,代表乘车记录的数量。

接下来的 n n n 行,每行包含 3 个整数,相邻两数之间以一个空格分隔。第 i i i 行的第 1 个整数代表第 i i i 条记录乘坐的交通工具,0 代表地铁,1 代表公交车;第 2 个整数代表第 i i i 条记录乘车的票价 p r i c e i price_i pricei ;第三个整数代表第 i i i 条记录开始乘车的时间 t i t_i ti(距 0 时刻的分钟数)。

我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。

输出格式

输出文件有一行,包含一个正整数,代表小轩出行的总花费。

样例 #1

样例输入 #1

6
0 10 3
1 5 46
0 12 50
1 3 96
0 5 110
1 6 135

样例输出 #1

36

样例 #2

样例输入 #2

6
0 5 1
0 20 16
0 7 23
1 18 31
1 4 38
1 7 68

样例输出 #2

32

提示

【输入输出样例 1 说明】

第一条记录,在第 3 分钟花费 10 元乘坐地铁。

第二条记录,在第 46 分钟乘坐公交车,可以使用第一条记录中乘坐地铁获得的优惠票,因此没有花费。

第三条记录,在第 50 分钟花费 12 元乘坐地铁。

第四条记录,在第 96 分钟乘坐公交车,由于距离第三条记录中乘坐地铁已超过 45 分钟,所以优惠票已失效,花费 3 元乘坐公交车。

第五条记录,在第 110 分钟花费 5 元乘坐地铁。

第六条记录,在第 135 分钟乘坐公交车,由于此时手中只有第五条记录中乘坐地铁获得的优惠票有效,而本次公交车的票价为 6 元,高于第五条记录中地铁的票价 5 元,所以不能使用优惠票,花费 6 元乘坐公交车。

总共花费 36 元。

【输入输出样例 2 说明】

第一条记录,在第 1 分钟花费 5 元乘坐地铁。

第二条记录,在第 16 分钟花费 20 元乘坐地铁。

第三条记录,在第 23 分钟花费 7 元乘坐地铁。

第四条记录,在第 31 分钟乘坐公交车,此时只有第二条记录中乘坐的地铁票价高于本次公交车票价,所以使用第二条记录中乘坐地铁获得的优惠票。

第五条记录,在第 38 分钟乘坐公交车,此时第一条和第三条记录中乘坐地铁获得的优惠票都可以使用,使用获得最早的优惠票,即第一条记录中乘坐地铁获得的优惠票。

第六条记录,在第 68 分钟乘坐公交车,使用第三条记录中乘坐地铁获得的优惠票。

总共花费 32 元。

【数据规模与约定】

对于 30 % 30\% 30% 的数据, n ≤ 1000 n \leq 1000 n1000 t i ≤ 1 0 6 t_i \leq 10^6 ti106

另有 15 % 15\% 15% 的数据, t i ≤ 1 0 7 t_i \leq 10^7 ti107 p r i c e i price_i pricei 都相等。

另有 15 % 15\% 15% 的数据, t i ≤ 1 0 9 t_i \leq 10^9 ti109 p r i c e i price_i pricei 都相等。

对于 100 % 100\% 100% 的数据, n ≤ 1 0 5 n \leq 10^5 n105 t i ≤ 1 0 9 t_i \leq 10^9 ti109 1 ≤ p r i c e i ≤ 1000 1 \leq price_i \leq 1000 1pricei1000

答案1

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

//乘车记录的数量(n)
int n;
// 交通工具(g)、票价(p)、时间(t)
int g[100010],p[100010],t[100010];
int sum=0;//总花费(sum)
int ques=0; //优惠票总数(ques)

queue<int> q1;//优惠票时间队列(q1)
queue<int> q2;//优惠票价钱队列(q1)


int main()
{
    cin>>n;// 记录条数n
    for(int i=1; i<=n; i++)
    {
        // 记录交通工具(g)、票价(p)、时间(t)
        cin>>g[i]>>p[i]>>t[i];
        // 判断地铁
        if (g[i] ==0)
        {
            //因为地铁一定要花钱,所以将总花费(sum)加上票价(p)
            //坐地铁一定会拿到一张优惠票,
            //我们将优惠票的时间压入时间队列(q1),
            //将票价压入价钱队列(q2),并将优惠票的数量(ques)加1
            sum += p[i];
            q1.push(t[i]);
            q2.push(p[i]);
            ques++;
        }
        // 筛出废票
        //当优惠票超过45分后,该优惠票就会失效,
        //因为队列FIFO的特性,只要队首的那张没超时,就代表后面的都没超时。
        //因此使用while循环(附加非空判定以防万一)
        while(t[i]-q1.front()>45 && !q1.empty())
        {
            //只要循环进去了,说明这张票废了,
            // 把两个队列(q1q2)的队首都弹出,并把优惠票数量(ques)减1
            q1.pop();
            q2.pop();
            ques--;
        }
        int f=0;//优惠票使用状态
        int quesd = ques;//优惠票备用数量quesd
        //判断公交
        if(g[i]==1)
        {
            //接下来为保险起见分为有优惠票(优惠票队列(q1q2)非空)和
            //无优惠票(优惠票队列(q1q2)为空)两种情况考虑。先写出判断语句
            if(!q1.empty())
            {
                /*接下来进入重头戏,就是当有优惠票时,因为优惠票可能会不能用,
                而且没有规律(不像时间队列(q1)有规律),在这里所有的优惠票肯定都不会超时(超时的全弹出去了)。
                我们在这里使用这样的方法:
                把队列(q1q2)从头到尾检索一次,即使已经有符合的了也要全检索完(因为优惠票需要按时间顺序排列,其顺序不能更改)。
                如何检索呢?只需要把队首压入队尾,再把队首弹出就可以了,这样第一位就会变到最后一位,第二位变到第一位,以此类推。
                当全部走完后,第一位又会变回第一位。
                */
                //首先,进行循环
                /*为什么这里要用备用数量(quesd)呢?因为假设有优惠票被使用,那么此票就会被弹出,数量(ques)会减1(参见上文第四大步),
                因为数量会变,所以需要存一个固定的值,也就是quesd
                紧接着分两种情况,一种是该票可以使用,一种是该票不能使用。
                可以使用即是价钱队列(q2)的队首大于等于乘坐此次公交所花的钱,不可以使用则反之。
                为判断方便,以可以使用为条件,不可以使用为该条判断的else
                */
                if(f ==0 && p[i]<=q2.front())
                {
                    /*此处的使用状态(f)为后期进行判定时使用,f为0表示本轮还没有使用优惠票,f为1表示本轮使用了优惠票
                    当满足条件时,表示可以使用优惠票,f的值改为1,并将该票弹出队列(q1q2),优惠票数量(ques)减1
                    */
                    f=1;
                    q1.pop();
                    q2.pop();
                    ques--;

                }
                else
                {
                    q1.push(q1.front());
                    q2.push(q2.front());
                    q1.pop();
                    q2.pop();
                }
            }
            else
            {
                //当无优惠票时,无论如何都要花钱,
                //else里面将总花费(sum)加上票价(p)。
                sum += p[i];
                continue;

            }
            if ( f == 0 )
            {
                sum += p[i] ;
            }
        }
    }
    cout<<sum;
    return 0;//完美结束
}

输出为:
在这里插入图片描述

答案2

#include <iostream>

using namespace std;
const int MAXN = 100005;
struct Ticket {
    //赠票的价格,最晚使用时间和是否需用过
    int price, time, used;
} q[MAXN];//赠票盒子
int head, tail, n, cost;

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int op, price, time;
        //输入每次坐车的种类,价格和发车时间
        cin >> op >> price >> time;
        if (op == 0) {
            //如果是坐地铁,直接把价格加到cost里面
            cost += price;
            //新一张赠票插入数组末尾,这张票的最晚使用时间是当前时间+45
            q[tail].time = time + 45;
            //赠票面额就是地铁票价
            q[tail++].price = price;
        } else {
            //先用一个循环把过期票扔掉
            while (head < tail && q[head].time < time) {
                head++;
            }
            bool found = false;//表示是否有合适的赠票,先假设没有
            for (int j = head; j < tail; ++j) {
                //循环所有剩余的票,这些一定都没过期,因为题目中时间是按顺序给我们的
                if (q[j].price >= price && q[j].used == 0) {
                    //如果价格合适,并且没用过,标记找到了,这张票标记用过
                    found = true;
                    q[j].used = 1;
                    break;
                }
            }
            //如果没找到合适的赠票,老老实实花钱买吧
            if (!found) cost += price;
        }
    }
    cout << cost << endl;
    return 0;
}

输出为:
在这里插入图片描述

现场真题注意事项

https://cspoj.com/contest.php?cid=1002
Fus5yz4x3EcSJH1Z

注意事项

  1. 文件名(程序名和输入输出文件名)必须使用英文小写。(提交必须使用freopen()进行提交)
  2. C/C++ 中函数 main() 的返回值类型必须是 int,程序正常结束时的返回值必须是0。
  3. 提交的程序代码文件的放置位置请参考各省的具体要求。
  4. 因违反以上三点而出现的错误或问题,申述时一律不予受理。
  5. 若无特殊说明,结果的比较方式为全文比较(过滤行末空格及文末回车)。
  6. 程序可使用的栈空间内存限制与题目的内存限制一致。
  7. 全国统一评测时采用的机器配置为:Inter® Core™ i7-8700K CPU @3.70GHz,内存 32GB。上述时限以此配置为准。
  8. 只提供 Linux 格式附加样例文件。
  9. 评测在当前最新公布的 NOI Linux 下进行,各语言的编译器版本以此为准

/*
假设输入样例数据存在文件test.in中,输出样例数据存在文件test.out中,
则在CSP、NOI等比赛的代码中,需添加freopen、fclose语句,
内容详见模板代码如下。
*/

#include <bits/stdc++.h>
#include<cstdio>//必须包含cstdio头文件
#include<iostream>
using namespace std;
 
int main(){
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	
	cout<<"Hello NOI"<<endl;
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}

下面为函数的简介,详细可参见 http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html
函数名:freopen
声明:FILE *freopen( const char *path, const char *mode, FILE *stream );
所在文件: stdio.h
参数说明:
path: 文件名,用于存储输入输出的自定义文件名。
mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。
stream: 一个文件,通常使用标准流文件。
返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。(一般可以不使用它的返回值)
功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    freopen("7532.in", "r", stdin);
    freopen("7532.out", "w", stdout);
    //原来的代码保持不变
    double a, b, r;
    int k;
    cin >> a >> b;
    k = int(a/b);
    r = a - b * k;
    printf("%g", r);
    //-------------
    fclose(stdin);
    fclose(stdout);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1066244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【@胡锡进】大模型量化分析- 福耀玻璃 600660.SH

SARIMA模型: import pandas as pd import numpy as np from statsmodels.tsa.statespace.sarimax import SARIMAX# 将日期转换为datetime格式 data[date] pd.to_datetime(data[date], format%Y%m%d)# 创建SARIMA模型 model SARIMAX(data[close], order(1, 0, 0), seasonal_o…

智慧空调插座:智控生活好伴侣,节能降耗好帮手

所谓“智能插座”&#xff0c;就是在普通插座上增加Wi-Fi模块&#xff0c;通过手机APP控制单个或整个插座的电源通断&#xff0c;并统计一段时间的用电量。 目前市面上所销售的智能插座&#xff0c;大多具备可连接Wi-Fi网路功能&#xff0c;如此一 来便不需要额外再购买定时控…

聊聊MySQL面试常问名词回表、索引覆盖,最左匹配

文章目录 1. 前言2. 回表操作 Index Lookup2.1 什么是回表2.2 回表的成本2.3 如何避免回表 3. 索引覆盖 Covering Index3.1 什么是索引覆盖3.2 索引覆盖的优点3.3 如何使用索引覆盖 4. 最左匹配原则&#xff08;Leftmost Prefix Match&#xff09;4.1 什么是最左匹配原则4.2 最…

扬尘监测:智能化解决方案让生活更美好

随着工业化和城市化的快速发展&#xff0c;扬尘污染问题越来越受到人们的关注。扬尘不仅影响城市环境&#xff0c;还会对人们的健康造成威胁。为了解决这一问题&#xff0c;扬尘监测成为了一个重要的手段。本文将介绍扬尘监测的现状、重要性以及智能化解决方案&#xff0c;帮助…

csdn问答混赏金的记录贴

本文只记录用户名称&#xff0c;证据详情请点击&#xff1a;证据详情传送门 文章目录 第一位——夜深人静的哝玛 (PS:与本人的头像和用户名大致一样&#xff0c;注意区分)第二位——代码调试大神&#xff08;惯犯&#xff0c;截不完&#xff09;第三位——这一次有糖 第一位——…

03_Node.js模块化开发

1 Node.js的基本使用 1.1 NPM nodejs安装完成后&#xff0c;会跟随着自动安装另外一个工具npm。 NPM的全称是Node Package Manager&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。 2020年3月17日&…

vue3+elementPlus el-select 增加全选和取消全选

要求el-select支持多选&#xff0c;并增加全选和取消全选功能&#xff0c;缺点是提交的数据中会有全选这个字段 代码如下 <template><div>全选功能</div><el-select multiple collapse-tags v-modelselectedArray changechangeSelect remove-tagremoveTa…

SignalIR入门

SignalIR入门 简介教程1.创建项目2.添加 SignalR 客户端库3.创建 SignalR 中心4.配置 SignalR5.添加 SignalR 客户端代码 效果 简介 SignalR 是一个用于构建实时 Web 应用程序的开发工具和库&#xff0c;它可以让服务器端代码与客户端代码之间建立双向通信。SignalR 的中文解释…

2023 CCF中国开源大会会议通知(第一轮)

一、会议简介 2023 CCF中国开源大会&#xff08;CCF ChinaOSC&#xff09;拟于2023年10月21日至22日在湖南省长沙市北辰国际会议中心召开。大会由中国计算机学会&#xff08;CCF&#xff09;、开放原子开源基金会主办&#xff0c;CCF开源发展委员会、湖南先进技术研究院承办&a…

Windows服务器 开机自启动服务

1、新建txt&#xff0c;并粘贴下面脚本 start cmd /k "cd /d D:\ahjd&&java -jar clips-admin.jar" start cmd /k "cd /d D:\ahjd\dist&&simple-http-server.exe -i -p 8000"说明&#xff0c;脚本格式为&#xff1a;start cmd /k “cd /d…

OLED透明屏技术在智能手机、汽车和广告领域的市场前景

OLED透明屏技术作为一种新型的显示技术&#xff0c;具有高透明度、触摸和手势交互、高画质和图像显示效果等优势&#xff0c;引起了广泛的关注。 随着智能手机、汽车和广告等行业的快速发展&#xff0c;OLED透明屏技术也在这些领域得到了广泛的应用。 本文将介绍OLED透明屏技…

千万别再学python编程了?编程没用了?马上就要被淘汰啦?

最近&#xff0c;看到网上好多人站在在职程序员的角度去分析编程语言的一个优劣&#xff0c;劝小白学这个语言别学那个语言&#xff0c;这对小白来说是毫无意义的。 但是它又具有极强的一个误导性。 为什么呢&#xff1f; 一、语言只是工具&#xff0c;解决问题才是关键 编程…

web漏洞-SSRF服务端请求伪造

目录 SSRF服务端请求伪造一、定义二、漏洞成因三、漏洞探测四、漏洞利用五、复现pikachu靶场SSRF实验&#xff0c;并且探测靶机端口开放情况。六、利用SSRF探测内网环境并获取shell七、绕过技巧八、SSRF防御方案九、总结 SSRF服务端请求伪造 一、定义 SSRF&#xff08;Server-…

微信小程序拉取代码到运行过程(mac)

微信小程序拉取代码到运行过程&#xff08;mac&#xff09; window也可以参考 1.克隆代码 2.进入项目&#xff0c;安装依赖 此时项目中已经有node_modeles了 3.打开微信开发者工具&#xff0c;导入项目 点击项目-导入 导入刚刚克隆的项目&#xff0c;AppID会自动填入 这里…

基于Springboot实现简历管理系统演示【项目源码+论文说明】分享

基于Springboot实现简历管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;简历系统当然也不能排除在外。简历系统是以实际运用为开发背景&#xff0c;运用软件…

剑指offer——JZ82 二叉树中和为某一值的路径(一) 解题思路与具体代码【C++】

一、题目描述与要求 二叉树中和为某一值的路径(一)_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一个二叉树root和一个值 sum &#xff0c;判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 …

consulmanage部署

一、部署consul 使用yum方式部署consul yum install -y yum-utils yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo yum -y install consul 执行以下命令获取uuid密钥并记录下来 uuidgen 编辑consul配置文件 vi /etc/consul.d/consul.h…

【Vue面试题四】、Vue实例挂载的过程中发生了什么?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;Vue实例挂载的过程 一、…

【抓包https请求网络异常/无数据怎么破】

当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的App都提示网络异常/无数据等等信息。 当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的Ap…

it端到端运营监控

公司的运维监控已成为确保业务顺利运行的关键。特别是对于IT部门&#xff0c;端到端运维监控不仅可以帮助企业及时发现和解决问题&#xff0c;还可以提高业务效率&#xff0c;优化客户体验。端到端运维监控的概念、重要性及其实施方法。 端到端操作监控的概念 端到端操作监控&…