AtcoderABC252场

A - ASCII codeA - ASCII code

AtcoderABC252场_第1张图片AtcoderABC252场_第2张图片

题目大意

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

思路分析

使用cout<

时间复杂度

O(1)

代码

#include 
using namespace std;

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

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

B - Takahashi’s FailureB - Takahashi’s Failure

AtcoderABC252场_第3张图片AtcoderABC252场_第4张图片AtcoderABC252场_第5张图片

题目大意

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
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

AtcoderABC252场_第6张图片AtcoderABC252场_第7张图片AtcoderABC252场_第8张图片

题目大意

给定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   
#include  
#include  
#include   // 包含整型最大值常量

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;
}

你可能感兴趣的:(算法)