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 }
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 "); 20 return 0; 21 } 22 if(n > m) { 23 puts("Dasha"); 24 } 25 else if(n == m) { 26 printf("Equal "); 27 } 28 else { 29 printf("Masha "); 30 } 31 32 return 0; 33 }