A题
A题问说知道半径,要求周长,那么直接把
C
C
C=
2
π
r
2πr
2πr这个公式套上去,OK~
当然,求圆周率有一个函数:acos(-1)
,就不用慢慢背“
3.1415926535897932384626433832795
3.1415926535897932384626433832795
3.1415926535897932384626433832795”了。
CODE:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int R;
cin >> R;
cout << R*2*acos(-1) << endl;
return 0;
}
B题
B题就是纯模拟,只要把下面的数全加起来,再和N比个大小,最后输出-1
或它们的差就行了
CODE:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m, n, x, t=0;
cin >> m >> n;
for (int i=1; i<=n; i++)
{
cin >> x;
t+=x;
}
if (t>m) cout << -1 << endl;
else cout << m-t << endl;
return 0;
}
C题
这看似是个树状结构,但我们并不需要了解一个节点的整个子树,所以,只要简单的数组累计,就可以啦~
CODE:
#include <bits/stdc++.h>
using namespace std;
int sum[200002];
int main()
{
int n, x;
cin >> n;
for (int i=2; i<=n; i++)
{
cin >> x;
sum[x]++;
}
for (int i=1; i<=n; i++) cout << sum[i] << endl;
return 0;
}
D题
这道题其实就是数学。我们只要求当取
k
k
k个数时,
m
a
x
max
max-
m
i
n
min
min+
1
1
1就能得到当前的总数量。
m
a
x
max
max就是取
k
k
k个数时的最大值,
m
i
n
min
min就是指取
k
k
k个数时的最小值。
然后,让
k
k
k++,一直加到
n
n
n+
1
1
1为止。
当然,学过数学的人都知道,这个累加过程可以用求和公式,而两个求和公式相减也可以用分配率。具体过程大家可以自行推导,我这里就说一下最终的推导结果:
当取
k
个数时,和的数量就是
(
n
-
k
+
1
)
×
k
+
1
\text{当取}k\text{个数时,和的数量就是}(n\text{-}k\text{+}1)\text{×}k\text{+}1
当取k个数时,和的数量就是(n-k+1)×k+1
别忘了
m
o
d
(
1
0
9
+
7
)
mod(10^9\text{+}7)
mod(109+7)哦~
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n, k, t=0;
cin >> n >> k;
for (long long i=k; i<=n+1; i++) t+=(n-i+1)*i+1, t%=1000000007;
cout << t << endl;
return 0;
}