A - On and OffA - On and Off
题目大意
一个人每天在指定的时间点打开房间的灯,并在另一个时间点关闭灯。问题是确定在给定的时间点,灯是否亮着。
思路分析
注意时间24小时制,同一天和隔夜两种情况
确定给定的时间点是否在灯亮的时间范围内。根据题目给出的约束条件,可以使用以下逻辑来判断:
同一天:如果 s 小于等于 x 并且 x 小于 t
隔夜:s 大于 t 并且 (x 大于等于 s 或者 x 小于 t),则灯亮。
否则,灯不亮。
时间复杂度
O(1)
AC代码
#include<iostream>
using namespace std;int main()
{int s, t, x;cin >> s >> t >> x;if ((s <= x && x < t) || (s > t && (x >= s || x < t))){cout << "Yes" << endl;}else{cout << "No" << endl;}return 0;
}
B - Takahashi’s Secret B - Takahashi’s Secret
题目大意
Takahashi有N个朋友,他们都有昵称:Friend 1, Friend 2, …, Friend N。
有一天,Takahashi不小心让他的一个朋友Friend X知道了他的秘密。
对于每个i = 1, 2, …, N,当Friend i得知秘密时,如果Friend Ai还没有得知秘密,则他/她会与Friend Ai分享秘密。
最后有多少个Takahashi的朋友会知道这个秘密?
思路分析
解题关键:何时终结?
直到找到一个已经知道秘密的朋友
可以使用一个布尔数组b,记录哪些朋友已经知道秘密。用一个数组a来表示每个朋友所知道的秘密的来源,即a[i]表示Friend i得知秘密时,他/她从哪个朋友那里得知的。初始时,所有朋友都未知秘密,即a[i]=i。然后,从Friend X开始,逐步迭代找到秘密的来源,直到找到一个已经知道秘密的朋友。
时间复杂度
O(N)
AC代码
#include<bits/stdc++.h>
using namespace std;int main()
{int n,x;cin>>n>>x;int a[100001];bool b[100001];// 输入每个朋友的秘密来源for(int i=1;i<=n;i++)cin>>a[i];int i=x;int ans=0;do{b[i]=true; // 标记当前朋友已知秘密i=a[i]; // 更新当前朋友的秘密来源ans++;}while(!b[i]); // 直到找到一个已知秘密的朋友cout<<ans<<endl; return 0;
}
C - Final DayC - Final Day
题目大意
N个学生参加了一场为期4天的考试。每天有一个300分的测试,总共有1200分。已经过去了头三天的考试,现在即将开始第四天的考试。第i个学生(1≤i≤N)在第j天(1≤j≤3)上得到了Pi,j分。
对于每个学生,确定他/她是否有可能在第四天之后排名前KK。
思路分析
看该学生的总分加上300(第四天的最高分)是否大于等于排名前K的学生前三天的总分(第四天的最低分)。
时间复杂度
O(NlogN)
AC代码
#include <bits/stdc++.h>
using namespace std;int main() {int n, k;cin >> n >> k; k -= 1; // 将KK减去1,以便与数组索引对应vector<int> p(n); // 定义一个保存每个学生总分的数组for (int& x : p) {int a, b, c;cin >> a >> b >> c; x = a + b + c; // 计算每个学生的总分并保存在数组中}vector<int> q = p; // 复制总分数组sort(begin(q), end(q), greater<>()); // 对总分数组进行降序排序for (int x : p) {cout << (x + 300 >= q[k] ? "Yes" : "No") << '\n'; // 判断每个学生是否有可能在第四天之后排名前k}
}