A - JoggingA - Jogging
题目大意
高桥和青木一起慢跑,高桥每隔 A+CA+C 秒钟走 BB 米,然后休息 CC 秒钟,青木每隔 D+FD+F 秒钟走 EE 米,然后休息 FF 秒钟。现在已经过去了 XX 秒钟,问谁跑得更远。
思路分析
模拟来解决这个问题,即按照题目描述模拟高桥和青木的行动,计算他们在 X 秒钟内各自前进的距离,然后比较距离大小即可。
时间复杂度
O(X)
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c,d,e,f,x;
cin>>a>>b>>c>>d>>e>>f>>x;
int rt=0,ra=0;
for(int i=0;i<x;i++){
if(i%(a+c)<a) rt+=b;
if(i%(d+f)<d) ra+=e;
}
if(rt>ra)cout<< "Takahashi"<<endl;
if(rt<ra)cout<< "Aoki"<<endl;
if(rt==ra)cout<<" Draw"<<endl;
}
B - Perfect StringB - Perfect String
题目大意
给定一个字符串S,判断它是否为美妙的字符串。美妙的字符串满足以下条件:
- 字符串包含至少一个大写英文字母。
- 字符串包含至少一个小写英文字母。
- 字符串中的所有字符都互不相同。
思路分析
为了判断字符串S是否为美妙的字符串,需要检查以下三个条件:
1.检查字符串S是否包含至少一个大写英文字母。可以使用 isupper() 函数来检查每个字符是否为大写字母。
2.检查字符串S是否包含至少一个小写英文字母。可以使用 islower() 函数来检查每个字符是否为小写字母。
3.检查字符串S中的所有字符是否互不相同。可以使用两个嵌套的 for 循环来比较每对字符。如果找到相同的字符,则将 diff 设置为 false。
时间复杂度
O(|S|2)
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
bool big=false,small=false;
for(int i=0;i<s.size();i++)
{
if(isupper(s[i])) big=true;
else small=true;
}
bool diff = true;
for(int i = 0; i < s.size(); i++){
for(int j = i + 1; j < s.size(); j++){
if(s[i] == s[j]) diff = false;
}
}
if(big && small && diff) cout << "Yes" << endl;
else cout << "No" << endl;
}
C - Just KC - Just K
题目大意
给出 N 个字符串 S1,S2,…,SN,每个字符串由小写英文字母组成。
选择若干个字符串,找到包含恰好 K 个已选择字符串中的一些字母的最大不同字母数。
思路分析
由于题目给出的 N 不超过 15,因此可以接受使用指数级时间复杂度算法,即枚举所有可能的字符串选择情况。
要在 N 个字符串中选择若干个字符串,这是一个经典的子集枚举问题。可以使用位运算来实现枚举。具体地,可以将每个字符串看作一个二进制数,第 i 位为 1 表示选择第 i 个字符串,为 0 表示不选择。然后枚举所有可能的字符串选择情况,对于每种情况,统计其包含的字母数,最终取最大值即可。
在统计包含的字母数时,可以使用数组 sum 维护每个字母出现的次数。具体地,对于已选择的字符串,遍历其中的每个字母,将其对应的 sum 数组元素加 1。最后,遍历 sum 数组,统计出现次数为 K 的字母数 now,即为当前字符串选择情况下包含的字母数。
时间复杂度
O(2^N * N * σ)
其中 σ 表示小写英文字母的数目,即 26。
AC代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,k;
cin>>n>>k;
vector<string> s(n);
for(int i=0;i<n;i++) cin>>s[i];
int ans=0;
for(int i=0;i<(1<<n);i++){
vector<int> sum(26);
for(int j=0;j<n;j++){
if((i>>j)&1){
for(int x=0;x<s[j].size();x++) sum[s[j][x]-'a']++;
}
}
int now=0;
for(int j=0;j<26;j++) if(sum[j]==k) now++;
ans=max(ans,now);
}
cout<<ans<<endl;
}