2018 HBCPC 菜鸡选手记
我果然太菜了
作为学校最菜的队员,今天下午被虐惨了。
一下午才做A-D四道题
官方题解链接
晚上吃完饭再去看。
A
队友A的不清楚。没看题。
B——T2
多组数据,每行都是这个格式
R r L
r两个球的半径
L两球距离
求两个球的组合体的表面积
正确答案是a
a大于1时,相对误差不超过
否则,绝对误差不超过
这是一道数学题
球冠表面积公式
然后关键是求h。
数学渣渣加空间想象能力不好的我做了一个小时才做出来。中间莫名wa了两次,最后发现是式子退错了。改正后还是wa,最后怀疑是精度问题。把余弦定理的式子代进去,然后发现分母的一个R可以约去,精度误差–;然后把cout换成printf(这个很迷)。总算AC了。
若是相交,一定是个圆(当然还有可能刚好缩成一个点)。
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const double mypi = atan(1)*4;
double R,r,L,h,H,s,S,ans,c1,c2;
/*double ccc(double a,double b,double c) { return (b*b+c*c-a*a)/(2*b*c); }*/
int main()
{
while (cin>>R>>r>>L) {
/*c1 = ccc(r,R,L); c2 = ccc(R,r,L); H = min(2*R,R+R*c1); h = min(2*r,r+r*c2); S = 2*mypi*R*H; s = 2*mypi*r*h;*/
H = R+min(R,((R+r)*(R-r)/L+L)/2);
h = r+min(r,((R+r)*(r-R)/L+L)/2);
ans = R*H+r*h;
ans = ans*2*mypi;
printf("%lf\n",ans);
}
return 0;
}
之后队友说他D题一句话翻译不出来,死活搞不懂样例啥意思,不然就A了。叫我看看。
然后开始看题,看完之后发现是个水题。
D——T4
操作
1. 附加一条commit,此时增加一个新版本
2. 恢复到第i天的状态
初始——day0
每天会执行一个操作
系统会计算整个项目的hash值,校验和
是所有有效(不包括回复撤销掉的版本)commit的校验和
的亦或值。
任务:计算所有的校验和
工程天数
n
接着按时间顺序有n行操作,是:
1. > commit x
2. > checkout k
每一天结束操作之后输出工程的校验和
样例解释
day0 checksum = 0
day1 commit 1 checksum = 0^1 = 1
day2 commit 2 checksum = 1^2 = 3
day3 checkout 1 checksum看day1的chekcsum是什么,day1是1
day4 ceckout 0 checksum看day0,是0
…
总之,commit x就是用前一天的checksum = checksum^x
checkout x 就是看day x的checksum是什么,是什么就直接抄过来
因为checkout x是回复到day x的工作转态,所以之后的都是失效的。
ps,最后我弄明白了他哪里没看懂,他把revert看成reverse了,以为是checkout是使某天激活or失效,然后就样例解释不通了。
最后让他A了这题
C——T3
求题目给的排序方法(貌似是冒泡)的期望交换次数
1-n共n个数的排列逆序数和正序数的和一定是 . 是组合数。因为n个数里选两个要不就是逆序要不就是正序
对于n个数的所有排列的逆序数的和与正序数的和显然相等,而这两个和相加就是
因此n个数的排列的期望(平均)逆序数就是
但是题目要求若是分数 输出
但是 化为最简要不就是整数要不就是
也就是说后面的 是固定的一个数,而且题目样例很好的给出了这个数 的结果等于直接给出了这个数是500000004
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const long long ttt = 500000004ll;
const long long p = 1000000007ll;
long long n,nn,ans;
int main()
{
while (cin>>n) {
nn = n-1ll;
n%=p;nn%=p;
switch(n%4) {
case 0:
n/=4;
ans=(n*nn)%p;
break;
case 1:
nn/=4;
ans=(n*nn)%p;
break;
case 2:
n/=2;
ans=(n*nn)%p;
ans=(ans*ttt)%p;
break;
case 3:
nn/=2;
ans=(n*nn)%p;
ans=(ans*ttt)%p;
break;
}
cout<<ans<<endl;
}
return 0;
}
F
F是求无权无向图的直径
点数n,边数m
n m
m行
u v
所有点对之间的距离的最大值即图的直径。
$
蒟蒻只会每个点出发,然后bfs求距离,之后取最大,当然这样是无情地tle.
然后各种百度也是无果。