ATCoder ABC 001

ATCoder ABC 001

题目链接

A 题

太简单了,不放代码了。

B 题

其实,就是模拟,只是需要注意边界问题,是一个左开右闭的区间。

代码:

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
#include <bits/stdc++.h>
using namespace std;

int main()
{
int m;

cin >> m;
if (m == 0)
cout << 0 << 0 << endl;
else if (m > 0 && m <= 5000)
{
if (m < 1000)
cout << 0 << (10 * m) / 1000 << endl;
else
cout << (10 * m) / 1000 << endl;
}
else if (m > 5000 && m <= 30000)
cout << m / 1000 + 50 << endl;
else if (m > 30000 && m <= 70000)
cout << (m / 1000 - 30) / 5 + 80 << endl;
else
cout << 89 << endl;
return (0);
}

C 题

同样是模拟,只是 else if 的数量有点多,注意边界,同上。

这道题目需要求一个保留两位小数的浮点数,所以需要自己手写函数 Around

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>

using namespace std;

double Around(double x,double k){
return floor(pow(10,k)*x+0.5) / pow(10,k);
// 保留两位小数
}

int main()
{
string s;
int cmp,meter;double speed,sid;
cin>>sid>>meter;
speed = meter / 60.0;
speed = Around(speed,1);
if(sid >= 112.5 && sid <= 337.5) s = "NNE";
else if(sid >= 337.5 && sid < 562.5) s = "NE";
else if(sid >= 562.5 && sid < 787.5) s = "ENE";
else if(sid >= 787.5 && sid < 1012.5) s = "E";
else if(sid >= 1012.5 && sid < 1237.5) s = "ESE";
else if(sid >= 1237.5 && sid < 1462.5) s = "SE";
else if(sid >= 1462.5 && sid < 1687.5) s = "SSE";
else if(sid >= 1687.5 && sid < 1912.5) s = "S";
else if(sid >= 1912.5 && sid < 2137.5) s = "SSW";
else if(sid >= 2137.5 && sid < 2362.5) s = "SW";
else if(sid >= 2362.5 && sid < 2587.5) s = "WSW";
else if(sid >= 2587.5 && sid < 2812.5) s = "W";
else if(sid >= 2812.5 && sid < 3037.5) s = "WNW";
else if(sid >= 3037.5 && sid < 3262.5) s = "NW";
else if(sid >= 3262.5 && sid < 3487.5) s = "NNW";
else s = "N";

if(speed >= 0.0 && speed <= 0.2){printf("C 0\n");return 0;}
else if(speed >= 0.3 && speed <= 1.5) cmp = 1;
else if(speed >= 1.6 && speed <= 3.3) cmp = 2;
else if(speed >= 3.4 && speed <= 5.4) cmp = 3;
else if(speed >= 5.5 && speed <= 7.9) cmp = 4;
else if(speed >= 8.0 && speed <= 10.7) cmp = 5;
else if(speed >= 10.8 && speed <= 13.8) cmp = 6;
else if(speed >= 13.9 && speed <= 17.1) cmp = 7;
else if(speed >= 17.2 && speed <= 20.7) cmp = 8;
else if(speed >= 20.8 && speed <= 24.4) cmp = 9;
else if(speed >= 24.5 && speed <= 28.4) cmp = 10;
else if(speed >= 28.5 && speed <= 32.6) cmp = 11;
else cmp = 12;


cout<<s<<" "<<cmp<<endl;
return 0;
}

D 题

比较简单的思维题。

输入时,注意时间为 5 分钟为增量舍入时间,观察题目发现时间总是从 \(0000 \Rightarrow 9999\)。所以可以想到开一个桶,第 \(i\) 个桶表示第 \(i\) 个时间是否有雨。最后重新遍历一次桶,记录下开始和结束的节点并输入。

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
30
31
32
33
34
35
36
37
#include<cstdio>
#include<iostream>

using namespace std;

const int maxn = 110000;
int g[maxn];
int t;

int main()
{
cin>>t;
for(int i=1;i<=t;i++){
int x,y;
scanf("%d-%d",&x,&y);
x -= (x%5);y += (5 - y%5) % 5;
// cout<<x<<" "<<y<<endl;
if(y%100>=60){
y+=100;
y-=60;
}
for(int j=x;j<y;j++) g[j] ++;
}

int on=0,be=0;
for(int i=0;i<110000;i++){
if(g[i]){
if(!on)be=i;
on=1;
}
else if(on){
printf("%04d-%04d\n",be,i);
on=0;
}
}
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!