Introduction:
此次bronze silver正常难度,gold拉满,platinum不清楚,总体来说似乎有一点点毒瘤。。。主要出题人是传说中的Benjamin Qi
Bronze T1
有一说一,这题基本上读的懂题学过算法的人都基本能完成的标准签到题。
题目大意就是给定7个数,分别为
A
,
B
,
C
,
A
+
B
,
B
+
C
,
A
+
C
,
A
+
B
+
C
A, B, C, A+B, B+C, A+C, A+B+C
A,B,C,A+B,B+C,A+C,A+B+C, 根据这个数列求出
A
,
B
,
C
A,B,C
A,B,C
具体做法就是从小到大排序,不妨令
A
<
=
B
<
=
C
A<=B<=C
A<=B<=C 于是
a
1
,
a
2
a_1,a_2
a1,a2就分别为
A
,
B
A,B
A,B, 又因为
C
=
(
A
+
C
)
+
(
B
+
C
)
−
(
A
+
B
+
C
)
C=(A+C)+(B+C)-(A+B+C)
C=(A+C)+(B+C)−(A+B+C), 所以同时我们能得出
C
C
C,然后你就愉快地拿到了100分
#include <bits/stdc++.h>
using namespace std;
int a[8];
int main()
{
for (int i=1;i<=7;i++)
{
cin>>a[i];
}
sort(a,a+7); //排序
cout<<a[1]<<" "<<a[2]<<" "<<a[5]+a[6]-a[7]<<endl;
return 0;
}
Bronze T2
仔细看两眼,似乎还是一个签到题,比上一题还要无脑一些
题目大意就是给定每朵花的花瓣,让你找到有多少个区间,满足从
i
−
j
i-j
i−j这个区间中至少有一朵花,这朵花的花瓣数量是这个区间内所有花的花瓣数量的平均值
于是直接无脑双重循环枚举即可
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000005;
int n,cnt,a[maxn];
inline int check(int i,int j)
{
int tot=0,avg;
for (int k=i;k<=j;k++)
{
tot+=a[k];
}
avg=tot/(j-i+1);
for (int k=i;k<=j;k++)
{
if (a[k]==avg)
{
return 1;
}
}
return 0;
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
for (int i=1;i<=n;i++)
{
for (int j=i;j<=n;j++)
{
if (check(i,j))
{
cnt++;
}
}
}
cout<<cnt<<endl;
return 0;
}
Bronze T3
不多说,签到题++
题目大意:Farmer John有一些奶牛,朝向为北方和东方,有一个无限大的草场,奶牛们会不停的吃草,如果她当前所在的方格里的草已经被其他奶牛吃掉了,则她会停下;否则她会吃完她当前所在的方格中的所有草,并向她朝向的方向移动一个方格。如果两头奶牛在一次移动中移动到了同一个有草的方格,她们会分享这个方格中的草,并在下一个小时继续沿她们朝向的方向移动,求出每头奶牛吃到的草的数量。有些奶牛永远不会停下,从而吃到无限多的草
于是我们可以将两个不同朝向的奶牛分开,进行排序,然后一一去比较即可。
代码略长不做展示(码风问题)
于是bronze我们就利用了30min AK了
Gold T1
这题其实说实话想较Gold的T2以及T3难度较低
题目大意:给定机器人可能起始位置以及地图。每过一个小时,所有的机器人可以像某一个方向同时移动一格,没过D小时,没给机器人会复制一个自己在自己的上下左右的空格,当机器人碰到岩石,繁殖停止。求某一个时刻含有机器人的方格的数量。
思路:首先我们不难发现,按照这种方式产生副本,最终的机器人的图案一定呈现一个菱形。
于是我们判断每个中心能达到的最大扩展范围,寻找距离此点最近的岩石即可。
于是思路就逐渐清晰了。
考虑用bfs实现
首先第一个bfs预处理出每个点离最近的石头的距离,也就是每个点可以接受的最大复制机器人次数的点。
接下来我们可以找出到达某个点的最短时间,再根据它与最近的石头的距离,判断它是否能成为顶点。
最后我们维护到每个点机器人可以展开的最多个数,最终维护可到达点即可。
代码就不放了(过长)