首页 > 其他分享 >CSP-J 2019 公交换乘

CSP-J 2019 公交换乘

时间:2023-10-06 09:33:50浏览次数:44  
标签:pr 优惠券 int us po tim 2019 换乘 CSP

P5661 [CSP-J 2019] 公交换乘 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路如下:

用一个数组来存储现有的优惠劵,每次乘公交时遍历数组,若有符合条件的立即调用

每张优惠券只能用一次,还需要记录每张票的使用状况(用了/还没用)

所以就定义一个结构体

struct cu{
long long tim;    //获得优惠券的时间
int pr;                //优惠券的价格
};

还需要一个布尔数组记录票是否被使用过

bool us[100010];

当然把这个值定已进结构体里也是可以的

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct cu{
long long tim;//获得优惠券的时间
int pr;//优惠券的价格
};
cu c[100010];//优惠券箱子
int po;
bool us[100010];//记录优惠券是否被使用过
int n,ans;
int g,p,t;
int main()
{
// freopen("transfer.in","r",stdin);
// freopen("transfer.out","w",stdout);
cin>>n;
while(n>0)
{
cin>>g>>p>>t;
if(g==0)//坐地铁
{
ans+=p;
c[po].tim=t;
c[po].pr=p;
po++;
}
if(g==1)//坐公交
{
bool sh=true;//哨兵,记录是否有可用的优惠券
for(int i=1; i<po; i++)
{
if(us[i])continue;//票已经被用过了
if(t-c[i].tim>45)//票超时了
{
us[i]=true;
}
else if(c[i].pr>=p)//价格是否足够
{
us[i]=true;
sh=false;
break;
}
}
if(sh)ans+=p;//没有能用的劵只能掏钱了
}
n--;
}
cout<<ans;
return 0;
}

测完发现只得40分,出现了TLE

当然可以开启O2优化AC

分析数据结构后发现:
极限数据1051,假设开始的时候全坐地铁,坐了5∗104 次以后,我们的盒子里面有好多票啊。后面全坐公交,要坐5∗104 次,每次都在这个大盒子里面找合适的票,复杂度O(n2),总计算量2.5∗109,我们在超时的边缘疯狂试探啊。

这时可以发现优惠券获得的时间是由早到晚的,换句话说就是编号为 i 的票超时了,那么所有编号<=i 的票就都超时了

故我们可以定义一个数据head,记录最后一个超时的票,搜索时直接从head开始就好

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
struct cu{
long long tim;//获得优惠券的时间
int pr;//优惠券的价格
};
cu c[100010];//优惠券箱子
int po;
bool us[100010];//记录优惠券是否被使用过
int n,ans;
int g,p,t;
int head; //记录最后一张超时的票
int main()
{
// freopen("transfer.in","r",stdin);
// freopen("transfer.out","w",stdout);
cin>>n;
while(n>0)
{
cin>>g>>p>>t;
if(g==0)//坐地铁
{
ans+=p;
c[po].tim=t;
c[po].pr=p;
po++;
}
if(g==1)//坐公交
{
bool sh=true;//哨兵,记录是否有可用的优惠券
for(int i=head; i<po; i++)
{
if(us[i])continue;//票已经被用过了
if(t-c[i].tim>45)//票超时了
{
us[i]=true;
head=i;//超时了赶紧记下来
}
else if(c[i].pr>=p)//价格是否足够
{
us[i]=true;
sh=false;
break;
}
}
if(sh)ans+=p;//没有能用的劵只能掏钱了
}
n--;
}
cout<<ans;
return 0;
}

代码结束,草神附上

 

标签:pr,优惠券,int,us,po,tim,2019,换乘,CSP
From: https://www.cnblogs.com/Zelda-anjisuan/p/17744249.html

相关文章

  • CSP模拟49
    模板题、THUSC、8ady、白子说话模板题看似是多项式乘法模板题,实际发现最多只有\(25\)次询问。那么就可以\(O(n)\)处理每次询问,维护一个前缀和直接处理即可,注意考虑std::min(n,r-j)+j<l的情况,这种情况不能计算贡献。还有就是开longlong。THUSC考虑什么时候两......
  • CSP 2023
    以下是我的CSP2023时间线2023.9.1522:10比赛前一天,有点紧张2023.9.168:50到达普及组考场2023.9.1611:30考试结束我的CSP-J答案:BDAACBCADDABBADTTTABTFTCBDTTTBDCBACBDABABB2023.9.1613:32CSP-J:估分为90分使用https://oj.youdao.com/csp......
  • P5385 [Cnoi2019] 须臾幻境
    (无需LCT简化版:P4764)主要是记录一个Trick而非LCT、主席树等的使用。给定无向图,\(q\)次询问,求边权在\([l,r]\)内的边的生成子图的连通块数目。强制在线。对于连通块问题,考虑提取生成森林。连通块数目等于顶点数减去边数最多的生成森林的边数。强制在线也可以先用离线......
  • 牛客网 $CSP-S$ 模拟赛 $T1$
    给定正整数\(n\),计算\(n\)个元素的集合\(\{1,2,3,...,n\}\),所有非空子集和的乘积取模\(998244353\)后的结果\(n\leq200\)我的第一思路是考虑能不能通过\(i-1\)个元素的情况推出\(i\)个元素的情况,然后寄掉了,遂看题解\(dp\)问题不只是线性递推,这题的思路是用\(......
  • [极客大挑战 2019]Secret File
    查看源代码发现一个php文件,进行访问点击了一下,啥也没有退回去重新查看发现有个文件,访问发现是刚才那个页面,burp进行抓包看看发现了个隐藏文件访问secr3t.php通过代码审计,包含一个file的文件,用get方式传输,如果存在../,tp,input,data等字符就会输出Ohno构造payload:?file=flag.p......
  • CSP 2023 & HNCPC2023 游记
    2023-9-3开学前一天,文化课心态爆炸。下午刷了一套S组初赛润了。2023-9-4学校要求\(7:10\)到校。然后白天全都是入学教育,就是在会议厅听讲座。精神状态被老师折磨死了。然后晚上考试,大寄。基础爆搜分没拿。辛亏没作业,\(22:30\)睡觉。2023-9-5常规\(7:25\)到校。......
  • 【VMware篇】3-ESXi安装Windows Server2019虚拟机和更改配置
    第1章前言   本文主要介绍Dell服务器安装ESXI后虚拟机的安装,安装例子:WindowsServer2019。1.Windowsserver2019            Windowsserver2019是微软公司研发的服务器操作系统,WindowsServer2019包括三个许可版本:DatacenterEdition(数据中心版):适用于高虚拟化......
  • 10月4日 CSP-S 模拟
    10月4日CSP-S模拟赛总结2457题目大意给定一个长度为\(n\)的排列\(A\),问交换两数的位置,最多能使逆序对的数量减少多少思路50pts(\(n^2\))开两个二维数组,f1[i][j]表示\(i\)与\(j\)互换位置时对于\(i\)减少的逆序对数量(也可以是增加),f2[i][j]与f1[i][j]同理,不过......
  • CSP考前
    练习区\(\text{1.指针的使用√}\)\(\text{2.二叉树的遍历:前序、中序、后序√}\)\(\text{3.二叉搜索树的定义和构造√}\)\(\text{4.图的表示与存储:邻接矩阵、邻接表√}\)\(\text{5.搜索√}\)\(\text{6.链表}\)\(\text{7.倍增法(快速幂)}\)\(\text{8.动态规划}\)\(\text{9.......
  • [极客大挑战 2019]LoveSQL 1
    原理常规注入解题过程进入登录界面,还是使用万能登录试一试payload:1'or1=1#没想到成功了,说明字符型注入使用的'爆出的密码应该是MD5加密,爆破很麻烦,试试常规注入payload:1'orderby4#payload:1'orderby3#找出列项payload:1'unionselect1,database(),3#找出......