模拟赛(一)T117901 共享电动车
2020.1.30
模拟赛(一)
第三题直接放弃,只整理前两题
爆零老国王:再次爆零
T1共享电动车
题目背景
在疫情爆发后,W市停止了市内的公共交通,以防止病毒的大规模传播。而你现在有事需要出门,只能借助W市中的共享电动车。
题目描述
共享电动车的计费方式是每tt分钟1元,剩下不足tt分钟的部分也计1元。也就是说,如果你一次骑行了x分钟,则费用为⌈t/x⌉元。
现在你需要骑行n段行程,每段行程之间会休息一段时间。在休息时,你可以选择还车,立即结束本次租用,一段时间之后再次租车。也可以选择暂时锁车,继续计算时间。在一段行程中,你必须一直租用电动车骑行,不能还车。
给出你接下来的行程计划,请你求出最少的花费。
输入格式
第一行两个整数nn, tt,分别表示行程段数和计费周期。
接下来nn行,每行两个非负整数li, ril**i,r**i,分别表示第ii段行程的起始时刻和结束时刻(分钟)。
输出格式
一行一个整数,表示最少的花费。
输入输出样例
**输入 **
3 15
0 16
20 25
50 95
输出
5
说明/提示
对于30%的数据,n<=100 , rn<=5000
对于60%的数据,n<=1000
对于100%的数据,1<=n<=106,rn<=1018,1<=t<=rn,1≤t≤rn
保证行程不会重叠,且按照起始时刻升序给出,即ri-1<li<ri<li+1
每次租车骑行时间计算方式为还车时刻减租车时刻。
样例说明
第一次租用从0分钟到25分钟,共25分钟,2元。第二次租用从50分钟到95分钟,共45分钟,3元。
题解
获得成就:含冤而死
本来就写的贪心,策略也是正解策略,但是的确有一点小问题,所以爆零了
思路:白嫖就是了,嫖到就是赚到
因为是将所用时间除以计价时间,然后向上取整,所以不管骑不骑,都要等到最后一刻再还车,白嫖到最后一刻。这样,就能不让血汗钱白花!如果在白嫖结束前,下一段行程就开始了,那么就可以省一段时间的费用。如果不幸在白嫖结束之前没有开始新的行程,那就锁车,然后等新行程开始再开一辆。
写出AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long l, r, a, ans = 0, n, t, at = 0;
int main() {
scanf("%lld%lld", &n, &t);
for (int i = 1; i <= n; i++) {
scanf("%lld%lld", &l, &r);//一定要优化读入,不能用cin,会TLE
if (at >= r) {//特别注意这种情况,就是白嫖时间走完全程,这样就不用掏钱了
continue;
}
if (at <= l) {//白嫖失败,重新租车
a = (r - l + (t - 1)) / t;//重新租车的费用,向上取整的偷懒大法,不用double就能解决
at = l + t * a;//时间推移(只要不重新掏钱,就白嫖到底)
ans += a;
}
else {//白嫖成功,不还了,继续骑老车
a = (r - at + (t - 1)) / t;//从白嫖结束开始计费
at += t * a;//时间推移(只要不重新掏钱,就白嫖到底)
ans += a;
}
}
cout << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具