[COCI2018-2019#2] Preokret
题目描述
假如我们正在观看一场未来的球赛,比赛双方是 A 队和 B 队。我们知道两队的得分和每次得分的准确时间。在一秒内,不可能有超过一次得分。
King James 想要得到两个问题的答案:
- 上半场总共得了多少分?(整场比赛持续 4 × 12 4 \times 12 4×12 分钟)
- 发生多少次反超?(一次反超定义为一支队伍在得分小于对方后,经过投球使得得分超过对方)
输入格式
第一行输入正整数 A A A,表示 A 队的得分。
接下来的 A A A 行,每行输入正整数 A s A_s As,表示 A 队第 s s s 次得分的时间。
接下来的一行,输入正整数 B B B,表示 B 队的得分。
接下来的 B B B 行,每行输入正整数 B s B_s Bs,表示 B 队第 s s s 次得分的时间。
输出格式
输出两行,每行分别输出题目描述中对应问题的答案。
样例 #1
样例输入 #1
3
10
1400
1500
2
7
2000
样例输出 #1
3
1
样例 #2
样例输入 #2
6
15
30
35
55
60
2065
7
20
25
40
45
50
2070
2075
样例输出 #2
10
5
样例 #3
样例输入 #3
11
1402
1412
1428
1430
1441
1444
1453
1483
1485
1489
1490
9
1403
1405
1409
1435
1459
1460
1461
1487
1495
样例输出 #3
8
2
提示
样例 2 解释
| 比分(A:B) | 时间(秒) | 所属半场 | 是否发生反超 |
|---|---|---|---|
| 1 : 0 1:0 1:0 | 15 15 15 | 1 1 1 | 否 |
| 1 : 1 1:1 1:1 | 20 20 20 | 1 1 1 | 否 |
| 1 : 2 1:2 1:2 | 25 25 25 | 1 1 1 | 是(B) |
| 2 : 2 2:2 2:2 | 30 30 30 | 1 1 1 | 否 |
| 3 : 2 3:2 3:2 | 35 35 35 | 1 1 1 | 是(A) |
| 3 : 3 3:3 3:3 | 40 40 40 | 1 1 1 | 否 |
| 3 : 4 3:4 3:4 | 45 45 45 | 1 1 1 | 是(B) |
| 3 : 5 3:5 3:5 | 50 50 50 | 1 1 1 | 否 |
| 4 : 5 4:5 4:5 | 55 55 55 | 1 1 1 | 否 |
| 5 : 5 5:5 5:5 | 60 60 60 | 1 1 1 | 否 |
| 6 : 5 6:5 6:5 | 2065 2065 2065 | 2 2 2 | 是(A) |
| 6 : 6 6:6 6:6 | 2070 2070 2070 | 2 2 2 | 否 |
| 6 : 7 6:7 6:7 | 2075 2075 2075 | 2 2 2 | 是(B) |
数据规模与约定
对于 100 % 100\% 100% 的数据, 1 ≤ A , B ≤ 2879 1 \le A,B \le 2879 1≤A,B≤2879, 1 ≤ A s , B s ≤ 2880 1 \le A_s,B_s \le 2880 1≤As,Bs≤2880。
评分方式
每组数据第一行计 2 2 2 分,第二行计 3 3 3 分,每组数据共 5 5 5 分。
评分需要借助 Special Judge,详见附件。
说明
本题分值按 COCI 原题设置,满分 50 50 50。
题目译自 COCI2018-2019 CONTEST #2 T1 Preokret。
C++实现
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans=0,anss=0,ld;
int a[3000],b[3000],jsa[3000],jsb[3000];
int main(){
scanf(“%lld”,&n);
for(int i=1; i<=n; i++){
scanf(“%d”,&a[i]);
if(a[i]<=1440) ans++;
jsa[a[i]]=1;
}
scanf(“%lld”,&m);
for(int i=1; i<=m; i++){
scanf(“%d”,&b[i]);
if(b[i]<=1440) ans++;
jsb[b[i]]=1;
}
printf(“%lld\n”,ans);
for(int i=1; i<=3000; i++)
jsa[i]+=jsa[i-1],jsb[i]+=jsb[i-1];
for(int i=1; i<=3000; i++){
if(jsa[i]>jsb[i] && jsa[i-1]jsb[i-1] && ld2)
anss++;
if(jsa[i]<jsb[i] && jsa[i-1]jsb[i-1] && ld1)
anss++;
if(jsa[i]!=jsb[i])
{
if(jsa[i]>jsb[i]) ld=1;
else ld=2;
}
}
printf(“%lld”,anss);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
237

被折叠的 条评论
为什么被折叠?



