2023 CSP-J题解

news2025/7/28 9:26:06

T1 小苹果

题目描述

理论分析

        对于第一问,我们按照题意模拟每天取走的是多少个苹果即可。由于每天可以取走原来的\frac{1}{3},数据范围没次会降低到\frac{2n}{3},也就是说这样的过程的时间复杂度可以用下式表示:

f(n)=1+f(\frac{2n}{3})=2+f(\frac{2}{3}^2 n)=\cdots <2 \log_{2}n

对于本题的数据范围n<1e9,这个时间复杂度计算后在1e5左右,是可以接受的。

        对于第二问,首先有一个很显然的结论是:第n个苹果会存在于从第一天开始的连续的若干天,然后在后面的天里不再存在。因此,我们可以维护一个bool类型的变量,作为最后一个苹果还在不在的判别。然后在每一天的判断过程中,我们通过整除关系可判别,这个苹果是不是被拿走。

代码实现
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;
    int day=0, last=0;
    bool flag=false;
    while(n){
        day++;
        //是不是这天拿最后一个
        if(!flag&&(n-1)%3==0) flag=true, last=day;
        //这天结束,剩的苹果数
        n=n-(n-1)/3-1;
    }
    cout<<day<<" "<<last<<endl;

    return 0;
}

T2 公路

题目描述

理论分析

        贪心即可!对于这个题目来说,一共要走的路程是一定的,所有一共加多少油也是确定的。不存在选择某种加油方案剩余油多,而选择另外的方案剩余油少的问题。因此,我们要做的就是让每升油的油价尽可能的低。那么问题来了,我们能不能都用最低油价买油呢?显然,当开始的0号位置油价最低时(题目中的1号,这里直接对应代码的编号说明了!下同),我们可以办到这件事,但是当1号节点油价并不是最低价的时候,我们需要首先走到油价最低的站点,那就至少需要在前面的节点买油。也就是说,假设pos_{1}处的油价最低,我们的问题就演变为了,首先求1号点到pos_{1}最低花多少钱,然后后半段直接用pos_{1}处的油价走完就行。那前半程的求解是一个数据范围比原问题更小的问题的求解。

        我们当然可以像上述那样做递归的求解程序,只不过这样的时间效率是不高的,最差会来到O(n^{2}),只能通过一半左右的样例。实际上上述贪心的过程等价于下面的贪心:我们从前往后考虑每个节点,维护需求加油的数量(只保证可以走到下一个节点)num,加完油后走到下个节点后会剩下多少油last,以及历史(已经过节点)的最低油价mn。对于每个节点,我们花费num*mn保证可以走到下一个节点。(也就是说,我们在拥有历史最低油价的那个点在原来的基础上多加num升油保证可以走到下一个点)。

代码实现
#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main(){
    int n, d;
    cin>>n>>d;
    int last=0;
    vector<int> v(n);
    vector<int> a(n);
    for(int i=0; i<n-1; i++) cin>>v[i];
    int ans=0, mn=0x3f3f3f3f, num;
    for(int i=0; i<n-1; i++){
        cin>>a[i];
        // 历史低价
        mn=min(mn, a[i]);
        // 至少需要多少才能走到下一个点
        num=(v[i]-last+d-1)/d;
        ans=ans+num*mn;
        // 油余量够走多远
        last=num*d-v[i]+last;
    }
    cout<<ans<<endl;

    return 0;
}

T3 一元二次方程

题目描述

理论分析

        按照题意 老老实实模拟即可。需要注意的细节稍微有点多,但是细心一点也是可以一遍AC的!!
细节一:分数输出需要保证分母不是负数。
细节二:对于有两个解的情况而言,题中已经提示过x=q_{1}+q_{2}\sqrt r中的q_{2}>0,可以利用这一点简化代码的书写。
细节三:根号的化简要从大到小试探因数,这样更容易保证不重不漏。
细节四:根号内如果是完全平方数,那么最终结果将会不带有 “sqrt()” ,此时答案的化简需要自己分析好。
细节五:x=q_{1}+q_{2}\sqrt r格式的答案,要注意格外第一项是不是0的判断。
        大概就是这些细节吧。。。时间复杂度O(TM)

代码实现
#include <bits/stdc++.h>
#define int long long
using namespace std;

void print_sqrt(int s, int b, int a){
    int g=__gcd(b, a);
    pair<int, int> p;
    p.first=b/g;
    p.second=a/g;
    if(p.first<0) p.first*=-1;
    if(p.second<0) p.second*=-1;
    if(p.first!=1) cout<<p.first<<"*";
    cout<<"sqrt("<<s<<")";
    if(p.second!=1) cout<<"/"<<p.second;
}

void print_int(int b, int a){
    int g=__gcd(b, a);
    pair<int, int> p;
    p.first=b/g;
    p.second=a/g;
    if(p.second<0){
        p.first*=-1;
        p.second*=-1;
    }
    if(p.second==1) cout<<p.first;
    else cout<<p.first<<"/"<<p.second;
}

void solve(){
    int a, b, c, g;
    cin>>a>>b>>c;
    int delta=b*b-4*a*c;
    if(delta<0){
        cout<<"NO\n";
    }
    else if(delta==0){
        if(b==0) cout<<"0\n";
        else{
            print_int(-b, 2*a);
            cout<<"\n";
        }
    }
    else {
        bool flag=false;
        int num=1;
        for(int i=min(1000ll, delta-1); i>0; i--){
            if(i*i==delta){
                delta/=(i*i);
                num*=i;
                break;
            }
            else if(i*i<delta && delta%(i*i)==0){
                num*=i;
                delta/=(i*i);
            }
        }
        if(delta==1){
            if(a<0) print_int(-b-num, 2*a);
            else print_int(-b+num, 2*a);
            cout<<"\n";
        }
        else {
            if(b!=0) {
                print_int(-b, 2*a);
                cout<<"+";
            }
            print_sqrt(delta, num, 2*a);
            cout<<"\n";
        }
    }
}

signed main(){
    int n, m;
    cin>>n>>m;
    while(n--){
        solve();
    }

    return 0;
}

T4 旅游巴士

题目描述

理论分析

        这是一个分层图问题,即图上每个点要拆成k个点。拆点的依据是原本的点 mod\begin{matrix} & \end{matrix} k 意义下的到达时间。我们使用ans[i][j]表示到第i个点满足时间 mod\begin{matrix} & \end{matrix} k 的最短时间。初始条件为 ans[1][0]=0,然后跑最短路就行了。
        相对难处理的点在于每条边经过的时间限制,对于这一点,我们可以原地等待k的倍数时间达成(其实相当于出发时间晚了k的倍数时间)。

代码实现
#include <bits/stdc++.h>
#define int long long
using namespace std;

int ans[20005][100];
vector<vector<pair<int, int>>> g;

signed main(){
    int n, m, k;
    cin>>n>>m>>k;
    g.resize(n+1);
    int u, v, a;
    while(m--){
        cin>>u>>v>>a;
        g[u].push_back(pair<int, int> (v, a));
    }
    for(int i=1; i<=n; i++)
        for(int j=0; j<k; j++) ans[i][j]=0x7f7f7f7f7f7f7f7f;
    queue<pair<int, int>> q;
    q.push(pair<int, int> (1, 0));
    ans[1][0]=0;
    int now, pos, need;
    while(!q.empty()){
        auto t=q.front();
        q.pop();
        for(int i=0; i<g[t.first].size(); i++){
            now=g[t.first][i].first;
            pos=(t.second+1)%k;
            need=ans[t.first][t.second];
            if(need<g[t.first][i].second) need=need+(g[t.first][i].second-need+k-1)/k*k;
            need++;
            if(ans[now][pos]==-1||need<ans[now][pos]){
//                cout<<now<<" "<<pos<<" "<<need<<endl;
                ans[now][pos]=need;
                q.push(pair<int, int> (now, pos));
            }
        }
    }
    if(ans[n][0]>=0x7f7f7f7f7f7f7f7f) cout<<-1<<endl;
    else cout<<ans[n][0]<<endl;

    return 0;
}

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

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

相关文章

PHP/MySQL开发本地服务器软件 MAMP Pro for Mac

MAMP Pro是一款专为Mac用户设计的全功能本地服务器软件&#xff0c;可以将电脑变成一个完整的Web开发环境。无论个人开发者、网站管理员还是团队协作&#xff0c;MAMP Pro都提供了强大的工具和便捷的管理方式&#xff0c;能够更加高效地构建和测试网站。 MAMP Pro的基本功能包括…

数字IC前端学习笔记:优化的基4布斯编码华莱士树乘法器

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html 本文是对前文设计的乘法器&#xff0c;即基4布斯编码华莱士树乘法器的补充和优化&#xff0c;具体关于基4布斯编码和华莱士树的内容可以从以往的文章中获得。 数字IC前端学习笔记&#xff…

信息系统项目管理师教程 第四版【第11章-项目成本管理-思维导图】

信息系统项目管理师教程 第四版【第11章-项目成本管理-思维导图】 课本里章节里所有蓝色字体的思维导图

【HarmonyOS】ArkTS学习之二级菜单的实现

【关键词】 Menu、bindMenu、ArkTS 【实现方案】 方案一&#xff1a; 1、实现代码&#xff1a; Entry Component struct MenuExample {BuildermyMenu(){Menu(){MenuItem({content: 编译 Hap(s)})MenuItem({content: 编译 APP(s)})}}BuildersubMenu(){Menu(){MenuItemGroup(…

一次cs上线服务器的练习

环境&#xff1a;利用vm搭建的环境 仅主机为65段 测试是否能与win10ping通 配置转发 配置好iis Kali访问测试 现在就用burp抓取winser的包 开启代理 使用默认的8080抓取成功 上线

【向生活低头】win7打印机共享给win11使用,win11无法连接问题的解决

打印机是跟win7的电脑连接的&#xff0c;然后试了很多方法&#xff0c;win11都没法添加该打印机去使用。 网上的方法乱七八糟啥都有&#xff0c;但试了以后&#xff0c;发现基本没什么用。 刚刚发现知乎上的一个回答是有用的&#xff0c;这里做记录以备后用。 1.打开控制面板的…

cocosCreator 调用wxAPI 及后台授权设置、获取用户昵称和头像

版本&#xff1a; 3.8.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 官方文档&#xff1a; 微信官方文档 - 开放能力 微信 API 小游戏环境 在cocosCreator的3.x版本项目开发中&#xff0c;TypeScript最终会被转换为JavaScript语言。 JavaScript的运行时调用的API…

图解系列--L2交换机

大端&#xff0c;小端 网络上传输时&#xff0c;采用网络字节序。网络字节序为大端序。举例来说&#xff0c;对0x1020这样一个数值&#xff0c;按大端传输时&#xff0c;先传输0x10&#xff0c;再传输0x20&#xff1b;按小端传输时&#xff0c;先传输0x20&#xff0c;再传输0x…

Qt 中model/View 架构 详解,以及案例实现相薄功能

model/View 架构 导读 ​ 我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改…

k8s---pod进阶

//资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为容器指定了 li…

super(props)与react类式组件

1 为什么super() super是对父类构造器的调用。使用了后会自动继承父类的属性。要把super&#xff08;&#xff09;放到第一行是因为了以防在super&#xff08;&#xff09;之前&#xff0c;也就是没实例化父类之前&#xff0c;访问父类的属性。所以js将此作为一个语法点&#x…

机器视觉能不能再火爆?大多数企业订单减少是现实,大多数企业维持现有的经营状态将会非常困难,就看人工智能和新兴产业能不能破门而入

每个人都讲机器视觉代替大量人工&#xff0c;可是真的吗&#xff1f;没有订单&#xff0c;人工的存在都没必要&#xff0c;需要什么机器视觉检测。 我们首先有一个问题&#xff0c;机器视觉行业之前有没有火爆过&#xff1f; 有&#xff0c;但是出现短暂之后是内卷。深度学习A…

STM32-LIN总线详解1

.硬件规范&#xff1a; 1.总线形式&#xff1a;一主多从 2.总线通常为12V电压&#xff0c;最高波特率20K&#xff0c;最多容纳16个节点。 也有24V&#xff0c;和其他电平需要共地。 3.总线上波形 4. 单片机STM32与LIN收发器在LIN_CAN开发板上设计。 1K电阻自动控制电路&…

自定义元素宽高比例(aspect-ratio)与@supports兼容支持和图片裁剪(object-fit)的用法

使用grid布局可以轻松实现响应式布局&#xff0c;子元素只需要设置最小宽度即可&#xff0c;如果对子元素没有设置高度&#xff0c;那么高度取决于内容的最大值&#xff0c;这样显然是不稳定的&#xff0c;如下图所示&#xff1a; 出现这种问题就造成布局混乱了&#xff0c;可…

利用Vue2实现印章徽章组件

需要实现的组件效果&#xff1a; 该组件有设置颜色、大小、旋转度数和文本内容功能。 一、组件实现代码 <template><divclass"first-ring"v-bind"getBindValue":class"getStampBadgeClass":style"{ transform: rotate(${rotate}…

离散数学实践-编程实现利用真值表法求主析取范式以及主合取范式

*本文为博主本人校内的离散数学专业课的实践作业。由于实验步骤已经比较详细&#xff0c;故不再对该实验额外提供详解&#xff0c;本文仅提供填写的实验报告内容与代码部分&#xff0c;以供有需要的同学学习、参考。 -------------------------------------- 编程语言&#xff…

第2篇 机器学习基础 —(4)k-means聚类算法

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。聚类算法是一种无监督学习方法&#xff0c;它将数据集中的对象分成若干个组或者簇&#xff0c;使得同一组内的对象相似度较高&#xff0c;不同组之间的对象相似度较低。聚类算法可以用于数据挖掘、图像分割、文本分类等领域…

nodejs+php+python+微信小程序-基于安卓android的北京地铁票务APP-计算机毕业设计

根据现实中在北京地铁票务方面的需求&#xff0c;并对该系统进行了仔细的研究&#xff0c;将系统权限按照管理者和用户这两种类型进行了区分。 &#xff08;1&#xff09;用户功能需求   用户进入APP可以进行系统首页、地铁线路、我的等操作&#xff0c;在我的页面可以对我的…

NLP实践——中文指代消解方案

NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务&#xff0c;有很多开源的项目和工具可以借鉴&#xff0c;比如spacy的基础模…

【强化学习】12 —— 策略梯度(REINFORCE )

文章目录 前言策略梯度基于策略的强化学习的优缺点Example:Aliased Gridworld策略目标函数策略优化策略梯度利用有限差分计算策略梯度得分函数和似然比策略梯度定理蒙特卡洛策略梯度&#xff08;Monte-Carlo Policy Gradient&#xff09;Puck World Example Softmax随机策略 代…