A - Exact PriceA - Exact Price
题目大意
高橋的钱包里只有一个或多个100日元硬币,没有其他的东西。现在给定一个金额X,需要判断是否可能存在这样的情况,使得钱包中的总金额是X日元。
思路分析
根据题目要求,钱包中只有100日元硬币,因此总金额只可能是100的倍数。所以我们只需要检查X是否为100的倍数,并且X不等于0即可。
时间复杂度
O(1)
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x;
cin>>x;
if(x%100==0 && x!=0)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}
B - String ShiftingB - String Shifting
题目大意
给定一个非空字符串S,其中包含小写英文字母。通过对S进行零次或多次左移和零次或多次右移,找到能够得到的字符串中字典序最小和最大的字符串。
思路分析
要找到所有可能的字符串,即通过进行左移和右移得到的字符串集合。对于长度为n的字符串S,可以通过循环操作,将S的第i个字符放到字符串的末尾,形成新的字符串。因此,可以生成n个字符串,分别是将S的第i个字符放到末尾所得到的字符串。然后,可以通过对这些字符串进行字典序比较,找到最小和最大的字符串。
时间复杂度
O(n2)
AC代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.size();
// 创建一个存储通过左移和右移得到的字符串的 vector
vector<string> v(n);
for (int i = 0; i < n; i++) {
// 将 S 的第 i 个字符放到字符串的末尾,形成新的字符串
v[i] = s.substr(i, n - i) + s.substr(0, i);
}
// 找到最小的字符串并输出
cout << *min_element(begin(v), end(v)) << '\n';
// 找到最大的字符串并输出
cout << *max_element(begin(v), end(v)) << '\n';
return 0;
}
C - Doukasen C - Doukasen
题目大意
给定N个保险丝,这些保险丝连接在一起。第i个保险丝的长度为Ai厘米,每秒钟可以燃烧Bi厘米。
考虑同时从对象的左端点和右端点点燃火焰。找到两个火焰相遇位置与物体左端的距离。
思路分析
问题可转化为求火焰相遇位置的坐标。可以先计算燃烧完全需要的时间t,而在一半(相同)时间内左边燃烧了多少。
然后,从左到右遍历每个保险丝,根据保险丝的长度和每秒钟的燃烧速度计算火焰在当前保险丝上的燃烧长度。更新火焰的位置,并将火焰燃烧长度累加到答案中。
时间复杂度
O(N)
AC代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<double> a(n), b(n);
for (int i = 0; i < n; i++) cin >> a[i] >> b[i];
double t = 0, ans = 0;
for (int i = 0; i < n; i++) t += a[i] / b[i];
t /= 2;
for (int i = 0; i < n; i++) {
ans += min(a[i], t * b[i]);
t -= min(t, a[i] / b[i]);
}
cout << fixed << setprecision(15) << ans << endl;
return 0;
}