AtCoder Beginner Contest 374 A~D
A - Takahashi san 2
洛谷链接
AtCoder链接
题目
给你一个由小写英文字母组成的字符串
如果 san 结尾,则输出 Yes;否则输出 No。
代码
#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
cin >> s;
if (s[s.length() - 1] == 'n' && s[s.length() - 2] == 'a' && s[s.length() - 3] == 's')
puts("Yes");
else
puts("No");
return 0;
}
B - Unvarnished Report
洛谷链接
AtCoder链接
题目
有两个字符串
如果
在这里,如果
更确切地说,如果
这里,
代码
#include <bits/stdc++.h>
using namespace std;
string s, t;
int main()
{
cin >> s >> t;
for (int i = 0; i < (int)max(s.length(), t.length()); i ++ )
{
if (s[i] != t[i])
{
cout << i + 1 << '\n';
return 0;
}
}
puts("0");
return 0;
}
C - Separated Lunch
洛谷链接
AtCoder链接
题目
KEYENCE 总部有
将每个部门分配到
换句话说,求分配给
思路
由于
代码
#include <bits/stdc++.h>
using namespace std;
int n, p[30], ans = 0x3f3f3f3f, a, b;
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
scanf("%d", &p[i]);
for (int i = 0; i < (1 << n); i ++ )
{
a = b = 0;
for (int j = 0; j < n; j ++ )
{
if (i & (1 << j))
a += p[j];
else
b += p[j];
}
ans = min(ans, max(a, b));
}
cout << ans << '\n';
return 0;
}
D - Laser Marking
洛谷链接
AtCoder链接
题目
有一台印刷机可以通过发射激光在
-
打印开始时,激光位置位于坐标
(0,0) 。 -
在打印线段时,应遵循以下步骤。
- 首先,将激光位置移动到线段的一个端点。
- 可以从任一端点开始绘制。
- 然后,在发射激光的同时,将激光位置从当前端点直线移动到另一个端点。
- 不允许在线段中间停止打印。
-
不发射激光时,激光位置可以以每秒
S 个单位的速度向任意方向移动。 -
发射激光时,激光位置可以以每秒
T 个单位的速度沿打印线段移动。 -
激光位置移动以外的操作所需的时间可以忽略。
高桥希望使用这台印刷机印刷
第
有些线段可能会重叠,在这种情况下,他需要分别打印每个线段的重叠部分。
当他以最佳方式操作印刷机时,完成所有线段的印刷至少需要多少秒?
思路
按照题意,先算出位置到线段的一段所需的时间;再算出画线段所需的时间。
输出后发现与答案不一样,没关系,只要小数后六位是对的就行了。
记得要分情况,看先移动的线段的那一头。
代码
#include <bits/stdc++.h>
using namespace std;
double ans = 0x3f3f3f3f;
bool v[110];
int n, s, t, a[10010], b[10010], c[10010], d[10010];
void dfs(int x, int y, int z, double ss)
{
double q1, q2;
if (z == n)
{
ans = min(ans, ss);
return;
}
for (int i = 1; i <= n; i ++ )
{
if (!v[i])
{
v[i] = 1;
q1 = sqrt(double(a[i] - x) * double(a[i] - x) + double(b[i] - y) * double(b[i] - y));
q2 = sqrt(double(a[i] - c[i]) * double(a[i] - c[i]) + double(b[i] - d[i]) * double(b[i] - d[i]));
dfs(c[i], d[i], z + 1, ss + q1 / s + q2 / t);
q1 = sqrt(double(c[i] - x) * double(c[i] - x) + double(d[i] - y) * double(d[i] - y));
dfs(a[i], b[i], z + 1, ss + q1 / s + q2 / t);
v[i] = 0;
}
}
}
int main()
{
scanf("%d %d %d", &n, &s, &t);
for (int i = 1; i <= n; i ++ )
scanf("%d %d %d %d", &a[i], &b[i], &c[i], &d[i]);
dfs(0, 0, 0, 0);
printf("%.20lf", ans);
return 0;
}