A 翻滚吧牛牛(一)
每种翻滚的长度都可以直接求出来的 直接遍历就是了

class Solution {
public:
    const double PI = acos(-1);
    double circumference(int k)
    {
        double r[]={1,sqrt(3),2,sqrt(3),1};
        double res=0;
        for(int i=0;i<k;i++){
            res+=2.0*PI*r[i%6]/6.0;
        }
        return res;
    }
};

B 牛牛的分配
先全部累加计算平均分配行不行 不行再一个个踢出最少的

   int solve(int n, int x, vector<int>& a) {
        // write code here
        long long ans=0;
        for(int i=0;i<n;++i)
        {
            ans+=a[i];
        }
        sort(a.begin(),a.end());
        int k=n;
        for(int i=0;i<n;++i)
        {
            if((ans/k)<x) {ans-=a[i];k--;}
            else break;
        }
        return k;
    }
};

C 牛牛构造等差数列
计算9种开头情况 在计算等差和遍历统计

    #define ll long long
    int solve(int n, vector<int>& b) {
        if(b.size()<=2)return 0;
        int ans=b.size()+1;
        for(int i=-1; i<=1;++i)
            for(int j=-1;j<=1;++j) 
            {
                int p=b[0]+i, q=b[1]+j,d=q-p,cnt=!!i+!!j;
                for(int k=2;k<b.size();++k) 
                {
                    ll r=k*d+p;
                    if(abs(r-b[k])<=1)cnt+=!!abs(r - b[k]);/// 1 -1  加1   0 不加
                    else cnt=1e9;
                }
                ans=min(ans,cnt);
            }
        if(ans==b.size()+1) return -1;
        else return ans;
    }
};

D playfair
照着题意硬模拟(感谢学长提供的代码

class Solution {
public:
    /**
     * playfair加密算法
     * @param key string字符串 密钥
     * @param str string字符串 明文
     * @return string字符串
     */
    bool vis[200];
    int Map[10][10];
    string s = "";
    pair<int,int> p[30];
    string Encode(string key, string str) {
      memset(vis,0,sizeof(vis));
        memset(Map,0,sizeof(Map));
        int Len1 = key.size(), Len2 = str.size(), Len3 = 0;
        for(int i=0;i<Len2;i++)  if( str[i] == 'j' )  str[i] = 'i';
        for(int i=0;i<Len1;i++)
        {
            if( key[i] == 'j' )  key[i] = 'i';
            if( vis[key[i]-'a'] )  continue;
            s += key[i];
            Len3 ++;
            vis[key[i]-'a'] = true;
        }


        int x=0,y=0;
        for(int i=0;i<Len3;i++)
        {
            Map[x][y] = s[i]-'a';
            y++;
            if( y == 5 )  y = 0, x++;
        }
        for(int i=0;i<26;i++)
        {
            if( vis[i] || i+'a' == 'j' )  continue;
            Map[x][y] = i;
            y++;
            if( y == 5 ) y = 0, x++;
        }
         string ans = "";
        for(int i=0;i<5;i++,cout<<endl)  for(int j=0;j<5;j++)
            p[Map[i][j]] = make_pair(i,j);
        for(int i=0;i+1<Len2;i+=2)
        {
            int a = str[i] - 'a', b = str[i+1] - 'a';
            int x,y;
            if( a == b )  ans += str[i], ans += str[i+1];
            else if( p[a].first == p[b].first )
            {
                x = p[a].first;
                ans += (Map[x][ (p[a].second+1)%5 ] + 'a');
                ans += (Map[x][ (p[b].second+1)%5 ] + 'a');
            }
            else if( p[a].second == p[b].second )
            {
                y = p[b].second;
                ans += (Map[ (p[a].first+1)%5 ][y] + 'a');
                ans += (Map[ (p[b].first+1)%5 ][y] + 'a');
            }
            else
            {
                ans += (Map[ p[a].first ][ p[b].second ] + 'a');
                ans += (Map[ p[b].first ][ p[a].second ] + 'a');
            }
        }
        if( Len2%2 != 0 )  ans += str[Len2-1];

        return ans;
    }
};

E 牛牛摇骰子
小范围直接打表 大范围就应该是一直加11过去的 (后面发现只要22的表就行了

class Solution {
public:
    /**
     * 把所有询问的答案按询问顺序放入vector里
     * @param arr int整型vector 要查询坐标的数组
     * @return int整型vector
     */
    int a[100] = {0,3,4,1,2,3,2,1,2,3,2,1,4,3,2,3,4,3,2,3,4,3,2};
    vector<int> MinimumTimes(vector<int>& arr) {

        int Size=arr.size();
        vector<int> ans;
        for(int i=0;i<Size;++i)
        {
            if(arr[i]<=22)
            {
                ans.push_back(a[arr[i]]);
                continue;
            }
            int m=arr[i]%11,tmp=200000000;
            for(int j=m;j<=22;j+=11)///22范围内以加11起步可能有两个地方
            {
                tmp=min(tmp,a[j]+(arr[i]-j)/11);///要跑多少次11
            }
            ans.push_back(tmp);
        }
        return ans;
    }
};