AtcoderABC223场

A - Exact PriceA - Exact Price

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

题目大意

高橋的钱包里只有一个或多个100日元硬币,没有其他的东西。现在给定一个金额X,需要判断是否可能存在这样的情况,使得钱包中的总金额是X日元。

思路分析

根据题目要求,钱包中只有100日元硬币,因此总金额只可能是100的倍数。所以我们只需要检查X是否为100的倍数,并且X不等于0即可。

时间复杂度

O(1)

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int x;
  cin>>x;
  if(x%100==0 && x!=0)
    cout<<"Yes"<<endl;
  else 
    cout<<"No"<<endl;
  return 0;
}

B - String ShiftingB - String Shifting

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

题目大意

给定一个非空字符串S,其中包含小写英文字母。通过对S进行零次或多次左移和零次或多次右移,找到能够得到的字符串中字典序最小和最大的字符串。

思路分析

要找到所有可能的字符串,即通过进行左移和右移得到的字符串集合。对于长度为n的字符串S,可以通过循环操作,将S的第i个字符放到字符串的末尾,形成新的字符串。因此,可以生成n个字符串,分别是将S的第i个字符放到末尾所得到的字符串。然后,可以通过对这些字符串进行字典序比较,找到最小和最大的字符串。

时间复杂度

O(n2)

AC代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;
    int n = s.size();

    // 创建一个存储通过左移和右移得到的字符串的 vector
    vector<string> v(n);
    for (int i = 0; i < n; i++) {
        // 将 S 的第 i 个字符放到字符串的末尾,形成新的字符串
        v[i] = s.substr(i, n - i) + s.substr(0, i);
    }

    // 找到最小的字符串并输出
    cout << *min_element(begin(v), end(v)) << '\n';
    // 找到最大的字符串并输出
    cout << *max_element(begin(v), end(v)) << '\n';

    return 0;
}

C - Doukasen C - Doukasen

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

题目大意

给定N个保险丝,这些保险丝连接在一起。第i个保险丝的长度为Ai厘米,每秒钟可以燃烧Bi厘米。
考虑同时从对象的左端点和右端点点燃火焰。找到两个火焰相遇位置与物体左端的距离。

思路分析

问题可转化为求火焰相遇位置的坐标。可以先计算燃烧完全需要的时间t,而在一半(相同)时间内左边燃烧了多少。

然后,从左到右遍历每个保险丝,根据保险丝的长度和每秒钟的燃烧速度计算火焰在当前保险丝上的燃烧长度。更新火焰的位置,并将火焰燃烧长度累加到答案中。

时间复杂度

O(N)

AC代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<double> a(n), b(n);
    for (int i = 0; i < n; i++) cin >> a[i] >> b[i];
    double t = 0, ans = 0;
    for (int i = 0; i < n; i++) t += a[i] / b[i];
    t /= 2;
    for (int i = 0; i < n; i++) {
        ans += min(a[i], t * b[i]);
        t -= min(t, a[i] / b[i]);
    }
    cout << fixed << setprecision(15) << ans << endl;

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值