abc 463 题解
A - 16:9
这道题就是一道很简单的语法题,判断x:y是否为16:9。
16/9是无限小数,如何判断呢?
因为x:y=16:9,由小学数学可知,16y=9x。直接判断即可。
代码如下:
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int x, y; cin >> x >> y;
if(x * 9 == y * 16)
{
cout << "Yes" << endl;
}
else cout << "No" << endl;
return 0;
}
B - Train Reservation
本题相对简单。
问题陈述:
高桥正在尝试预订火车座位。
他考虑预订的候选列车有 $N$ 列,编号为 $1, 2, \dots, N$ 。每列火车有五列座位,分别称为 A 列、B 列、C 列、D 列和 E 列。
每列火车的当前座位可用性信息为字符串 $S _ 1, S _ 2, \dots, S _ N$ 。这里, $S _ 1, S _ 2, \dots, S _ N$ 的长度都是 $5$ ,列车 $i$ 的 A 列到 E 列分别对应 $S _ i$ 的第一到第五个字符。如果该字符为 "o",则相应列中有空位;如果该字符为 "x",则相应列中没有空位。
高桥希望在第 $X$ 列保留一个座位,其中 $X$ 是 A、B、C、D、E 中的一个。请判断至少一列火车的 $X$ 列中是否有空位。
解决思路
我们发现,我们只需要对每一个状态,看到要求行是否为'o'即可。
代码如下:
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int n; char x1; cin >> n >> x1;
while(n --)
{
string s; cin >> s;
if(s[x1 - 'A'] == 'o')
{
cout << "Yes" << endl;
return 0;
}
}
cout << "No" << endl;
return 0;
}
C - Tallest at the Moment
问题陈述(必须好好看,不然看不懂我的思路)
当前,会议室中有 $N$ 位高桥。第 $i$ 位 $(1\le i\le N)$ 高桥的身高为 $H_i$,将在 $L_i$ 分钟后离开房间。一旦高桥离开房间,便不会再返回。
你将收到 $Q$ 个查询,请按顺序回答。对于第 $i$ 个查询 $(1\le i\le Q)$,你会得到一个整数 $T_i$,请找出 $T_i+\dfrac{1}{2}$ 分钟后仍身处房间的高桥的最大身高。根据本题的约束条件,保证此时至少有一位高桥会在房间内。
解决思路
我们可以考虑DeepSleep给出的离线大顶堆解决。
核心:当$T$单调递减时,随着$T_i$的减小,$L_i>T$的数量只会增加,不会减少。
于是,我们可以这么做:
1.将$L_i$和$T_i$都按照从大到小排列
2.从大到小遍历$T_i$:
将每一个$L_i$<$T$的元素的元素都放入大顶堆中(因为他们离开的时间晚于$T_i$)
此时堆顶元素就是还在的人的最大身高
代码:
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
struct people{ int h, l; };
struct query{ int t, idx, ans; };
bool cmp1(people a, people b)
{
return a.l > b.l;
}
bool cmp2(query a, query b)
{
return a.t > b.t;
}
bool cmp3(query a, query b)
{
return a.idx < b.idx;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int n; cin >> n;
vector<people> peo(n);
for(int i = 0;i < n;i ++)
{
cin >> peo[i].h >> peo[i].l;
}
int q; cin >> q;
vector<query> Q(q);
for(int i = 0;i < q;i ++)
{
cin >> Q[i].t, Q[i].idx = i;
}
sort(peo.begin(), peo.end(), cmp1);
sort(Q.begin(), Q.end(), cmp2);
priority_queue<int> pq; int p = 0;
/*
for(query &qry : Q)
{
while(p < n && peo[p].l > qry.t)
{
pq.push(peo[p].h), p ++;
}
qry.ans = pq.top();
}
*/
for(auto &[t, idx, ans] : Q)
{
while(p < n && peo[p].l > t)
{
pq.push(peo[p].h), p ++;
} ans = pq.top();
}
sort(Q.begin(), Q.end(), cmp3);
for(auto [t, idx, ans] : Q)
{
cout << ans << endl;
}
return 0;
}

浙公网安备 33010602011771号