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

 

posted on 2020-12-05 15:04  吕瓜皮  阅读(115)  评论(0编辑  收藏  举报