2020.12.3 Codeforces Beta Round #73(Div2)補題報告
阿新 • • 發佈:2020-12-05
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 returnView Codesqrt((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 }
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