望有一定成绩的人能沉淀下来不要骄傲,一山更有一山高

望不太理想有点失落的人能尽早走出,前路漫漫

A.这是一个简单的签到题

这个题没什么说的,就是一个解义符的输出

1
2
3
4
5
6
7
#include<iostream>
#include<cstdio>
using namespace std;
int main(void){
printf("\\*CUIT!*\\");
return 0;
}

B.淼酱的个数

疯狂吐槽题面,(╯‵□′)╯︵┻━┻

由题意可知个数为一个等差数列,首项为a,末项为a+n-1,但是如果用for循环直接算的话会超时,因此需要用等差数列公式来算,而且需要开long long

1
2
3
4
5
6
7
8
9
10
#include<iostream>
#include<cstdio>
using namespace std;
int main(void){
long long a, n;
scanf("%lld %lld", &a, &n);
long long ans = (a + a + n - 1) * n / 2;
printf("%lld", ans);
return 0;
}

C.小戴想打篮球

因为小戴可以斜着走,因此只要某一列不是全部都有人那么小戴肯定可以利用他风骚的走位去扣篮。需要注意如果篮筐下有人小戴也会被拦。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<cstdio>
using namespace std;
int mp[2][10005];
int main(void){
int n;
while(scanf("%d", &n) == 1){
int flag = 1;
for(int i = 0;i < n;i++) scanf("%d",&mp[0][i]);
for(int i = 0;i < n;i++){
scanf("%d", &mp[1][i]);
if(mp[0][i] && mp[1][i]) flag = 0;
}
if(mp[1][n-1]) flag = 0;
if(flag) printf("xiaodai yyds\n");
else printf("xiaodai is upset\n");
}
return 0;
}

D.青蛙跳

这个题,把奇数步和偶数步分开看,然后推公式就可以得到答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include<cstdio>
using namespace std;
int main(void){
int t;
scanf("%d",&t);
while(t--){
int a, b, k;
scanf("%d %d %d", &a, &b, &k);
int num1 = k / 2;
int num2 = k / 2;
if(k % 2 == 1) num1++;
int ans = num1 * a - num2 * b;
printf("%d\n", ans);
}
return 0;
}

E.ACM又双叒叕来扫楼了

因为A和B都认为不能比对方多,但是需要最大化,所以最大的情况是A和B扫的一样多。所以答案就是离教室和最近的偶数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iosteam>
#include<cstdio>
using namespace std;
int main(void){
int n;
int num, sum = 0;
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&num);
sum += num;
}
if(sum % 2 == 1) sum--;
printf("%d", sum);
return 0;
}

F.嘲讽单身狗plus-pro

这个题比较难。

因为要求子段的平均值必须为11,那么我们可以处理一下,令当前值处理为当前值比11多多少数字,即num-11。然后如果要区间平均值为11,那么让少于11蹭一点,多于11的出一点,让他们都变成11,即区间和为0。因此题目就变为了,有多少个区间和为0。

例如我们对样例4进行处理

-17 4 18 10 7 3 19 0 2 19 15 -19

处理之后

-28 -7 7 -1 -4 -8 8 -11 -9 8 4 -30

很显然可以发现(2, 3)(6,7)(7,8,9,10,11)和为0,即他们可以互相平衡,多的给一点,少的补一点,然后都变成11,平均数也就成为了11。

那么怎么计算和为0的个数呢。

我们可以发现,当两个下标的前缀和相同时,他们之间这一部分的区间和一定为0。比如sum[1] = -28, sum[3] = -28, 那么(2,3)这一段的和为0.

利用这个性质,我们可以对处理之后的数组建立前缀和数组,统计其中每个数字的数量,然后C(n,2)随便选一个区间都是有效区间,然后累加即可得到答案。注意第零个也要算上,因为当sum[0]==sum[3]时,[1,3]也是一个有效区间。当然也需要开long long。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
const long long mod = 1e9+7;
long long a;
long long sum[maxn];
int main(void){
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%lld",&a);
sum[i] = sum[i-1] + 11 - a;
}
sort(sum, sum + n + 1);
long long ans = 0;
long long num = 1;
for(int i = 1;i <= n;i++){
if(sum[i] == sum[i-1]) num++;
else{
ans = (ans + (num * (num-1) / 2)) % mod;
num = 1;
}
}
ans = (ans + (num * (num - 1) / 2)) % mod;
printf("%lld",ans % mod);
return 0;
}