AtCoder ABC-305 心得

AtCoder ABC-305 心得

YuDong Lv2

AtCoder ABC-305

這是我第一次在AtCoder解題,老實說這不是我第一次參加XD,但第一場Register之後就忘記時間上去寫😥
不過這一次我有記得x) 晚了大概半小時左右
但我還是把我會解的都解一解了QQ
我的能力現在只會兩題

pA - Water Station

題目敘述:
總長的馬拉松跑道。每出現一個補給站
給定一,你要求出距離最近的補給站。

想法:
這題我們可以很快的就聯想出 5的倍數
所以我們就用簡單的判斷式就可以求出來了

CODE:

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
#include <iostream>
using namespace std;

signed main(void) {
int n;
cin >> n;
if (n % 5 == 0) {
cout << n << "\n";
} else {
if(n%5 == 1) {
n=n-1;
cout << n << "\n";
}
if(n% 5 ==2) {
n=n-2;
cout << n << "\n";
}
if(n % 5 == 3) {
n=n+2;
cout << n << "\n";
}
if(n % 5 == 4) {
n+=1;
cout << n << "\n";
}
}
}

但其實,我們可以再做一下優化:
從2個測資看一下

INPUT:

21

OUTPUT:

20

INPUT:

53

OUTPUT:

55

就可以推出: 如果餘數大於3,就是除以五再乘上五加上五 否則 除以五再乘上五

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

signed main(void) {
int n;
cin >> n;

if(n%5 >= 3) {
cout << n/5*5+5 << "\n";
} else {
cout << n/5*5 << "\n";
}
}

這樣會看起來更好讀,我也是在結束後看別人的程式碼才知道有這種想法的ww

pB - ABCDEFG

題目敘述:
有一段數線,上面有7個點
每個點到點的距離不同:


  • C

給定兩個點位求兩點位距離

範例測資:
INPUT:

A C

OUTPUT:

4

想法:
我先開map存放每個點相鄰的間距,在開一個unordered_map存放的下一個點
然後去判斷有沒有相鄰
有的話就輕鬆輸出
沒有的話
先判斷是否正向(依照字母順序)
在用迴圈下去跑:用我們存放的間距還有的下一個點去計算距離 然後輸出

CODE:

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

signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
map<string, int> distances = {
{"AB", 3},
{"BC", 1},
{"CD", 4},
{"DE", 1},
{"EF", 5},
{"FG", 9}
};
unordered_map<string, string> nextPoints = {
{"A", "B"},
{"B", "C"},
{"C", "D"},
{"D", "E"},
{"E", "F"},
{"F", "G"}
};

string p, q;
cin >> p >> q;
int distance = 0;
string current = p;

if (p + q == "AB" || p + q == "BC" || p + q == "CD" || p + q == "DE" || p + q == "EF" || p + q == "FG") {
cout << distances[p + q] << "\n";
} else {
if(p > q) {
swap(p,q);
current = p;
}
while (current != q) {
string next = nextPoints[current];
distance += distances[current + next];
current = next;
}
cout << distance << "\n";
}
}

賽後跟 士育 討論這題,他只用了很簡單的解法就過了xD
我把這題搞得很複雜x)

他的CODE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

// pB
#include<bits/stdc++.h>
#define int long long
#define IO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;

signed main()
{
IO;
char c[7]={'A','B','C','D','E','F','G'},p,q;
int d[6]={3,1,4,1,5,9},a,b,ans=0;
cin >> p >> q;
for(int i=0;i<7;i++)
{
if(c[i] == p) a = i;
if(c[i] == q) b = i;
}
if(a > b) swap(a,b);
// cout << a << " " << b << "\n";
for(int i=a;i<b;i++) ans += d[i];
cout << ans << "\n";
}

以上就是我這次解出的兩題
希望自己能夠更進步QQ
不管在Codeforces Div.3 還是 ABC 都能夠至少解出3題以上!

留言
此頁目錄
AtCoder ABC-305 心得