1. 程式人生 > 實用技巧 >2020.12.3 Codeforces Beta Round #73(Div2)補題報告

2020.12.3 Codeforces Beta Round #73(Div2)補題報告

B - Keyboard

1.題意

  你有一個長方形的鍵盤,共n行,每行n個鍵。每個鍵可以打出小寫字母,在按下Shift鍵時也可以打出大寫字母。鍵盤上每個鍵是一個邊長為1的正方形,相鄰的鍵之間沒有空隙。你想只用一隻手打字,但是當打字時按得鍵離Shift鍵太遠(歐幾里得距離大於x)時,你就不得不用到另一隻手。 請計算出使用另一隻手的最小次數。

輸入第一行包含三個整數n,m,x,接下來的n行每行有m個字元,字元間沒有空格,“S”代表Shift鍵。 接下來的一個整數代表文字長度q,接下來有q個字元代表文字,文字中只有大寫和小寫字母。如果你能打出這一篇文字,那麼輸出另一隻手的最小使用次數。如果無法全部打出則輸出-1。

2.題解

  用二維陣列存鍵盤,遍歷鍵盤,找到一個小寫字母,再遍歷鍵盤找所有的shift,更新最短距離,另外還需判斷當要大寫時是否有shift和鍵盤上是否有要輸入的字母。

3.程式碼

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int INF = 100005;
 4 int n, m, len, vis[27], ans;
 5 double dis[27], x;
 6 char mp[35][35];
 7 double diss(int x,int y,int xx,int yy) {
 8     return
sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy)); 9 } 10 string a; 11 int main() { 12 cin >> n >> m >> x; 13 for(int i = 1; i <= n; i++) { 14 for(int j = 1; j <= m; j++) { 15 cin >> mp[i][j]; 16 if(mp[i][j] >= 'a') { 17 vis[mp[i][j]-'
a'+1] = 1; 18 } 19 } 20 } 21 for(char g = 'a'; g <= 'z'; g++) { 22 dis[g-'a'+1] = INF; 23 for(int i = 1; i <= n; i++) { 24 for(int j = 1; j <= m; j++) { 25 if(mp[i][j] == g) { 26 for(int k = 1; k <= n; k++) { 27 for(int h = 1; h <= m; h++) { 28 if(mp[k][h] == 'S') { 29 dis[g-'a'+1] = min(dis[g-'a'+1], diss(i,j,k,h)); 30 } 31 } 32 } 33 } 34 } 35 } 36 } 37 cin >> len >> a; 38 for(int i = 0; i < len; i++) { 39 if((a[i] <= 'Z' && dis[a[i]-'A'+1] == INF) || (a[i] >= 'a' && !vis[a[i]-'a'+1])) { 40 cout << -1 << endl; 41 return 0; 42 } 43 if(a[i] <= 'Z' && dis[a[i]-'A'+1] > x) { 44 ans++; 45 } 46 } 47 cout << ans << endl; 48 49 return 0; 50 }
View Code

C - Trains

1.題意

  Vasya有兩個女友,一個叫Dasha,另一個叫Masha,她們分別住在Vasya所在地鐵線路的兩個始發站。當Vasya有空時,他會去找他的一個女友。他在某個時間下降到火車站,等待第一班火車到來(地鐵去哪,他就去哪個女友那裡)。但兩個方向的火車發車時間不同,向Dasha方向的火車a分鐘一班,向Masha方向的火車b分鐘一班。如果兩列火車同時到達,Vasya會朝著發車時間較長的方向前進。在第0分鐘,兩班火車同時從Vasya所在站的前一個站和後一個站開出。Vasya去哪個女友那裡的概率大,就輸出女朋友的英文名,如果一樣輸出“Equal”。

2.題解

  求出a,b的最小公倍數,作為一個週期,開longlong模擬去找哪個女朋友,在這個週期內去找哪個女朋友次數多,就輸出她的名字。

3.程式碼

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 ll gcd(ll a, ll b) {
 5     return b == 0 ? a : gcd(b, a % b);
 6 }
 7 int main() {
 8     ll a, b;
 9     scanf("%lld%lld", &a, &b);
10     ll c = gcd(a, b);
11     ll res = a * b / c - 1;
12     ll n = res / a;
13     ll m = res / b;
14     if(n > m) {
15         m++;    
16     } else if(n < m) {
17         n++;
18     } else {
19         printf("Equal\n");
20         return 0;
21     }
22     if(n > m) {
23         puts("Dasha");
24     }
25     else if(n == m) {
26         printf("Equal\n");
27     }
28     else {
29         printf("Masha\n");    
30     }
31     
32     return 0;
33 }
View Code