zoukankan      html  css  js  c++  java
  • 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
    ");
    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 }
    View Code
  • 相关阅读:
    连号区间数|2013年蓝桥杯B组题解析第十题-fishers
    带分数|2013年蓝桥杯B组题解析第九题-fishers
    翻硬币|2013年蓝桥杯B组题解析第八题-fishers
    错误票据|2013年蓝桥杯B组题解析第七题-fishers
    三部排序|2013年蓝桥杯B组题解析第六题-fishers
    前缀判断|2013年蓝桥杯B组题解析第五题-fishers
    黄金连分数|2013年蓝桥杯B组题解析第四题-fishers
    第39级台阶|2013年蓝桥杯B组题解析第三题-fishers
    马虎的算式|2013年蓝桥杯B组题解析第二题-fishers
    高斯日记|2013年蓝桥杯B组题解析第一题-fishers
  • 原文地址:https://www.cnblogs.com/lvguapi/p/14089736.html
Copyright © 2011-2022 走看看