公交换乘 题解
2023-08-20 10:47:19
发布于:广东
47阅读
0回复
0点赞
代码:
下面这个这一个TLE了,勿抄( 我 是 真 的 菜 )
#include <iostream>
using namespace std;
// 结构体定义
typedef struct ride // 用来记录乘车记录
{
bool type;
int price , time;
} rd;
typedef struct discount // 用来记录优惠(免费)票
{
bool used = true;
int getTime , mon;
} disc;
rd travel[100005]; // 定义数组
disc dis[100005]; // 一样的
int main()
{
int n , sum = 0; // 定义……
cin >> n;
for(int i = 0 ; i < n ; i++)
{
cin >> travel[i].type >> travel[i].price >> travel[i].time; // 输入……
bool flag = false; // 记录……
if(!travel[i].type) // 如果是0则为地铁
{
// 累加钱数
sum += travel[i].price;
// 记录相关优惠信息
dis[i].getTime = travel[i].time;
dis[i].mon = travel[i].price;
dis[i].used = false;
}
else // 公交车……
{
for(int j = 0 ; j < n ; j++)
{
// 一个简单的判断,判断票有没有用过,钱数是否<=优惠,是否超时……
if(!dis[j].used&&travel[i].price<=dis[j].mon&&travel[i].time-dis[j].getTime<=45)
{
flag = true; // 标记一下
dis[j].used = true; // 标记为优惠券用过
break;
}
}
if(!flag) // 如果标记没有变为true说明没有符合条见得,直接加到sum上
{
sum += travel[i].price;
}
}
}
cout << sum << endl;
return 0;
}
然后我突然发现了一件事情,才意识我其实没必要所有优惠券都存着……
我真傻
然后我就做了点优化
A FEW MOMENTS LATER……
#include <iostream>
using namespace std;
// 结构体定义
typedef struct ride // 用来记录乘车记录
{
bool type;
int price , time;
} rd;
typedef struct discount // 用来记录优惠(免费)票
{
int getTime = -1 , mon = -1; // 随时清理用过或过期的票,这样就不用used来记录了
} disc;
// 两个数组
rd travel[100005];
disc dis[50];// 只需要45个就够了,因为过期时间是45分钟,题目给出不会有两次车出现在同一分钟,所以最多存储45张优惠票,50是因为设了余量防止溢出
int main()
{
int n , l = 49 , sum = 0; // l = 49,从后往前存储,这样容易删除过期的票
cin >> n; // 输入
for(int i = 0 ; i < n ; i++)
{
cin >> travel[i].type >> travel[i].price >> travel[i].time;
bool flag = false; // 我们可爱的标记
//重复清理过期优惠券
// l要是=49就代表没有优惠券了(别问我大于49是怎样的,自己想想……)
// 别看是三重循环,速度可比以前快多了
while(l < 49 && travel[i].time - dis[49].getTime > 45) //当当前优惠券时间过期时就重复执行
{
//用for循环将数据向后一项推进,相当于把以前的最后一个覆盖,这也是为什么上面while循环减去的永远是dis[49].getTime
for(int k = 48 ; k > l ; k--)
{
dis[k+1].getTime = dis[k].getTime;
dis[k+1].mon = dis[k].mon;
}
// 并将之前最新的优惠券那里填上-1
dis[l+1].getTime = -1;
dis[l++].mon = -1;
}
// 当坐地铁时
if(!travel[i].type)
{
// 累加
sum += travel[i].price;
// 记录
dis[l].getTime = travel[i].time;
dis[l--].mon = travel[i].price;
}
// 当坐公交车时
else
{
// j不用再从0到j了,剩下了很多时间
for(int j = 49 ; j > l ; j--)
{
// 简单的小判断,判断钱数超没超
if(travel[i].price <= dis[j].mon)
{
// 没有接使用并标记,再将其前面的优惠券向前推进,从而覆盖这个优惠券,相当于删除
flag = true;
for(int k = j-1 ; k > l ; k--)
{
dis[k+1].getTime = dis[k].getTime;
dis[k+1].mon = dis[k].mon;
}
dis[l+1].getTime = -1;
dis[l++].mon = -1;
break;
}
}
// 没标记就累加
if(!flag)
{
sum += travel[i].price;
}
}
}
// 输出结果……
cout << sum << endl;
return 0;
}
就AC了
我是真的菜
(^ _ ^)V
欢迎加入团队
这里空空如也
有帮助,赞一个