AtcoderABC228场

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
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值