#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;
// 撒由哪啦┏(^0^)┛
break;
}
}
// 没标记就累加
if(!flag)
{
sum += travel[i].price;
}
}
}
// 输出结果……
cout << sum << endl;
return 0;
}
1155 · 三角形面积 · 题目答案:
题目描述:
输入三角形三边长a,b,c(保证能构成三角形),输出三角形面积。
#include<bits/stdc++.h>
using namespace std;
int main(){
double a , b , c;
cin >> a >> b >> c;
double p = (a + b + c) * 1.0 / 2;
double s = sqrt(p * (p - a) * (p - b) * (p - c));
cout << fixed << setprecision(4) << s;
return 0;
}