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