AtcoderABC252场

A - ASCII codeA - ASCII code

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

题目大意

根据给定的整数N(在范围[97, 122]内),输出对应的ASCII码值为N的小写英文字母。

思路分析

使用cout<<char(n)<<endl;来将整数N转换为对应的字符,并输出结果到标准输出流。

时间复杂度

O(1)

代码

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    cout << char(n) << endl;
    
    return 0;
}

B - Takahashi’s FailureB - Takahashi’s Failure

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

题目大意

Takahashi家里有N种食物。第ii种食物的美味程度为Ai。他不喜欢其中的K种食物:对于每个i=1,2,…,K他不喜欢第Bi种食物。
在所有N种食物中最美味的食物中(最美味有重复多个),Takahashi将随机选择一种并吃掉。如果他有机会吃到自己不喜欢的食物,则打印Yes;否则,打印No。

思路分析

题目要求判断Takahashi是否有机会吃到自己不喜欢的食物。首先找出美味程度最高的食物,然后判断这些食物中是否包含Takahashi不喜欢的食物。

时间复杂度

O(n+k)
该算法的时间复杂度主要取决于食物数量n和不喜欢的食物数量k。首先,需要遍历n个食物的美味程度,然后再进行一次遍历k个不喜欢的食物编号。max_element函数的时间复杂度为O(n),而循环判断的时间复杂度为O(k)。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
vector<int> a(n),b(k);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<k;i++) cin>>b[i];
int  x= *max_element(a.begin(), a.end());
for(int i=0;i<k;i++)
{
if(a[b[i]-1]==x){ cout<<"Yes"<<endl;
return 0;}
}
cout<<"No"<<endl;
return 0;
}

#C - Slot StrategyC - Slot Strategy

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

题目大意

给定N个卷轴,每个卷轴上有10个不同的字符0到9,每个数字恰好一次。每个卷轴都有一个按钮,按下按钮后,卷轴会在t秒后停止,显示第((t mod 10)+1)个字符。目标是找到使所有卷轴显示相同字符所需的最小秒数。

思路分析

与列有关,行用cnt[s[i][j] - ‘0’][j]++;记录,10 * (cnt[k][j] - 1) + j)由题意分析知,若每一列只有唯一一个不同的数字在0-9之间,则一次就够了,为最大j,所以更新最大j。

  • 定义一个二维数组cnt[10][10]来记录每个数字在每个卷轴上出现的次数,初始化为0。
  • 遍历输入的每个卷轴字符串s[i],并更新cnt数组。
  • 对于每个数字k,遍历0到9的每个数字j,计算max(10 * (cnt[k][j] - 1) + j)并更新mx。

时间复杂度

O(102)

代码

#include <iostream>  
#include <vector> 
#include <string> 
#include <climits>  // 包含整型最大值常量

using namespace std;

int main() {
    int n;  
    cin >> n;  
    vector<string> s(n);  
    vector<vector<int>> cnt(10, vector<int>(10, 0));  
    for (int i = 0; i < n; i++) {  
        cin >> s[i];  
        for (int j = 0; j < 10; j++) {  // 遍历字符串中的每个字符
            cnt[s[i][j] - '0'][j]++;  
        }
    }

    int ans = INT_MAX;  // 最短时间的初始值设为整型最大值
    for (int k = 0; k < 10; k++) {  // 遍历每个数字
        int mx = 0;  // 当前数字的最大值
        for (int j = 0; j < 10; j++) {  // 遍历0到9的每个数字
            mx = max(mx, 10 * (cnt[k][j] - 1) + j); 
        }
        ans = min(ans, mx);  // 更新最短时间
    }

    cout << ans << endl;  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值