AtcoderABC257场

A - A to Z String 2A - A to Z String 2

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

题目大意

给定整数N和X,按顺序将字母A到Z重复N次,求得到的字符串中从开头算起第X个字符是什么。

思路分析

问题要求根据给定的N值,将字母A到Z重复N次,并找出第X个字符。可以通过计算X除以N的余数来确定所在字母的位置。

时间复杂度

O(1)

代码

#include<iostream>
using namespace std;
int main()
{
int n,x;
cin>>n>>x;
if(x%n) cout<<char(x/n+'A')<<endl;
else cout<<char(x/n+'A'-1)<<endl;
}

B - 1D PawnB - 1D Pawn

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

题目大意

给定N个方块和K个棋子,每个棋子初始时放在指定的方块上。进行Q次操作,每次操作将第Li个棋子向右移动一格(如果右边的格子没有其他棋子)。输出每个棋子最终所在的方块编号。

思路分析

需要记录每个棋子的当前位置,并根据操作将其移动到右侧合适的位置上。可以使用一个数组a来存储每个棋子的初始位置,然后根据操作更新数组a中的值。
a[1]…a[k]为棋子位置

时间复杂度

O(N+K+Q)

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,q;
int a[201];
int  l;
cin>>n>>k>>q;
for(int i=1;i<=k;i++) cin>>a[i];
while(q--)
{
 cin>>l;
if(a[l]==n)continue;
else if(l==k) a[l]++;
else if(a[l]+1<a[l+1]) a[l]++;
}
for(int i=1;i<=k;i++)
{
    cout<<a[i];
    if(i<k) cout<<" ";
}
cout<<endl;
return 0;
}

C - Robot TakahashiC - Robot Takahashi

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

题目大意

给定一组人的信息,包括每个人的体重和年龄信息。根据一个实数X,机器人Takahashi根据体重判断每个人是儿童还是成年人。如果一个人的体重小于X,则判断为儿童;如果体重大于等于X,则判断为成年人。定义函数f(X)表示根据实数X正确判断为儿童或成年人的人的数量。要求找到使f(X)最大的X值。

思路分析

根据体重划分,把每个体重都作为分界遍历一遍,更新f(x)最大值。注意Takahashi不能在体重相同的两个人之间进行划分,因为无法区分它们。
具体步骤:

  • 首先,将所有的人按照体重从小到大进行排序。
  • 初始化ans为已经被初始判断为成年人的数量(即字符串S中字符为’1’的个数)。
  • 从头开始遍历排序后的人的信息,假设一开始划分点在最左侧,并逐渐向右移动它的位置。最初,Takahashi将所有人都视为成年人,所以正确判断的人数等于成年人的数量。在划分点向右移的过程中,假设划分点左侧为儿童,右侧成人。如果从最左边算起的第i个人是儿童,则正确判断的人数增加1;如果从最左边算起的第ii个人是成年人,则正确判断的人数减少1
  • 在遍历过程中,通过比较当前人的体重和下一个人的体重来判断是否需要更新ans的值。如果体重不同,则说明这个位置可以作为划分点,更新ans为当前的ans和x(即被正确判断的人数)的较大值。否则体重相同不更新。

时间复杂度

O(NlogN)

代码

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

int main() {
    int n, x, ans;
    string s;
    vector<pair<int, char>> a;
    cin >> n;
    cin >> s;
    ans = 0;
    for (int i = 0; i < n; i++) {
        cin >> x;
        a.push_back({ x,s[i] });
        if (s[i] == '1') ans++;
    }
    sort(a.begin(), a.end());
    x = ans;
    for (int i = 0; i < n; i++) {
        if (a[i].second == '1') x--;
        else x++;
        if (i < (n - 1)) {
            if (a[i].first != a[i + 1].first) ans = max(ans, x);//遍历每个体重,体重相同则则不更新
        }
        else ans = max(ans, x);
    }
    cout << ans << endl;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值