AtcoderABC226场

文章介绍了如何使用round函数实现实数的四舍五入到最接近的整数,以及如何利用集合数据结构统计具有相同元素的序列数量,还讨论了武术家学习招式的时间优化问题,采用贪心策略解决前置条件依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A - Round decimalsA - Round decimals

在这里插入图片描述在这里插入图片描述

题目大意

给定一个实数X,它最多可以使用三位小数表示,而且X的小数点后有三位小数。将X四舍五入到最接近的整数并打印结果。

思路分析

可以使用round函数进行四舍五入

知识点

round(x) 是一个用来对数字进行四舍五入的函数。它接受一个参数 x,可以是整数、浮点数或其他可转换为数字的对象。该函数会根据传入的值 x 进行四舍五入,并返回一个最接近 x 的整数。

具体的规则如下:

  • 如果 x 是一个正数且小数部分大于等于 0.5,则 round(x) 返回大于 x 的最接近整数;
  • 如果 x 是一个正数且小数部分小于 0.5,则 round(x) 返回小于 x 的最接近整数;
  • 如果 x 是一个负数且小数部分绝对值大于等于 0.5,则 round(x) 返回小于 x 的最接近整数;
  • 如果 x 是一个负数且小数部分绝对值小于 0.5,则 round(x) 返回大于 x 的最接近整数;
  • 如果 x 是一个整数,则 round(x) 直接返回 x。

以下是一些例子:

  • round(3.2) 返回 3。
  • round(4.8) 返回 5。
  • round(-2.5) 返回 -2。
  • round(6) 返回 6。

时间复杂度

O(1)

AC代码

#include <iostream>
#include <cmath>
using namespace std;
int main() {
    double x;
    cin >> x;
    cout <<(int)(round(x)) << endl;
    return 0;
}

B - Counting ArraysB - Counting Arrays

在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意

给定N个序列,每个序列的长度为Li,并且第i个序列的第j个元素为ai,j。当且仅当序列i和序列j的长度相等且对应位置的元素相等时,认为序列i和序列j相同。求这N个序列中有多少个不同的序列。

思路分析

可以使用集合(set)来存储不同的序列。对于每一个序列,将其存储为一个vector,然后将该向量插入到set中。由于set会自动去重,所以最终set中存储的向量数量就是不同序列的数量。

时间复杂度

O(NMlogN)

AC代码

#include <iostream>
#include <set>
#include <vector>
using namespace std;

int main() {
  int N;
  cin >> N;
  set<vector<int>> st;
  for(int i = 0; i < N; i++) {
    int L;
    cin >> L;
    vector<int> v(L);
    for (auto& x : v) cin >> x;
    st.insert(v);
  }
  cout << st.size() << "\n";
}

C - Martial artistC - Martial artist

在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意

Takahashi是一位武术家。有N个他可以学习的招式,分别称为Move 1, Move 2, …, Move N。每个招式需要Ti分钟的练习时间才能学会。此外,在开始练习之前,必须已经学会所有的招式A[i][j]。其中,对于每个招式i,保证A[i][j] < i对于每个1 ≤ j ≤ Ki。
Takahashi在时间0时还没有学会任何招式。他不能同时练习多个招式,也不能停止已经开始的练习。找出Takahashi学会Move N所需的最少分钟数。

思路分析

贪心算法
针对每个招式i,如果已经学会了该招式的前置招式A[i][j],那么就可以开始练习招式i,并且需要消耗Ti分钟的练习时间。使用一个bool数组used[N]来记录每个招式是否被使用过。

从最后一个招式N开始向前遍历,如果该招式已经被使用(即前面的招式都已经学会),则将其练习时间Ti加到答案ans上,同时将它所依赖的前置招式全部标记为已使用。
最后输出答案ans即为学会Move N所需的最少分钟数。

时间复杂度

O(N)

AC代码

#include <bits/stdc++.h>
using namespace std;
#define N 200100
#define ll long long
#define rep(i, n) for(int i = 0; i < n; ++i)

ll t[N]; // 存储每个招式的练习时间
int k[N]; // 存储每个招式的前置招式的数量
vector<int> e[N]; // 存储每个招式的前置招式的索引
bool used[N]; // 记录每个招式是否被使用过

int main(void) {
    int n, x;
    ll ans = 0;
    rep(i, N) used[i] = false;

    cin >> n;
    rep(i, n) {
        cin >> t[i];
        cin >> k[i];
        rep(j, k[i]) {
            cin >> x;
            e[i].push_back(x - 1);
        }
    }

    used[n - 1] = true;
    for (int i = n - 1; i >= 0; i--) {
        if (used[i]) {
            ans += t[i];
            rep(j, k[i]) {
                used[e[i][j]] = true;
            }
        }
    }

    cout << ans << endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值