zoukankan      html  css  js  c++  java
  • [无聊测试赛] T1 凯撒密码

    本题的思路大致为首先解出每个字母所移动的格子数n,然后将所有的字母移动n个格子.

    n的解法: 第一行出现最多的字母和E的差就是n(题目后面的提示跳舞小人bfs证明可以理解为出现的频率)

    具体实现为利用map存第一行每个字符出现的次数,然后移动全盘就行了

    c++的好处在于他有内在的toupper(),tolower()和isalpha().在这题要注意答案全部需要转化为大写.我的解法是直接将输入转化为大写再统计

    #include <cctype>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <unordered_map>
    using namespace std;
    unordered_map<char,int> mp;
    char adj[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M',
                    'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};//懒得想
    int num = -1,maxi = 0, diff = -1;
    string strs[1005];
    inline void shift(char curr){
      if (!isalpha(curr)) {cout << curr; return;}
      cout << adj[((int)curr+diff-'A')%26];
    }//移位
    int main(){
      string s; cin >> s;
      while(s!="ENDOFINPUT"){
        if (s=="START"){
          getline(cin,s);
          getline(cin,s);//2个getline才行,cin.ignore()会爆.不要问为啥,这题我0分的原因就在此
          for (int i=0;i<s.length();i++) s[i] = toupper(s[i]);
          if (num==-1) {//如果不知道要移多少
            for (int i=0;i<s.length();i++) mp[s[i]]++;
            for (int i=0;i<26;i++) if (mp[adj[i]]>maxi){
              maxi = mp[adj[i]];
              num = i;
            }//统计
            diff = (30-num)%26;//E是第五个字符,在我的列表里为第四个,由于怕-num得到负数,故+26得到30
          }
          for (int i=0;i<s.length();i++) shift(s[i]);//移动
          cout << endl;
        }
        cin >> s;
      }
    }
    

    坑点不多,仔细一点就能A

  • 相关阅读:
    vue-cli的使用
    修饰模式(Decorator结构型)C#简单例子
    c#继承中的函数调用
    c#桥接模式(bridge结构模式)
    c#浅谈反射内存的处理
    C#中的try catch finally
    C#微信公众号开发系列教程(接收事件推送与消息排重)
    用 C# 读取二进制文件
    c#语言-多线程中的锁系统(一)
    .NET程序内,访问私有或者保护成员的技巧
  • 原文地址:https://www.cnblogs.com/DannyXu/p/12536346.html
Copyright © 2011-2022 走看看