编程语言
首页 > 编程语言> > 牛客编程巅峰赛S1第8场

牛客编程巅峰赛S1第8场

作者:互联网

翻滚吧牛牛(一)

牛牛有一个边长为1的正六边形,只要牛牛一推它就可以一直滚下去,正六边形左下角为A,牛牛想知道正六边形翻滚k次A点的轨迹边长是多少呢。如图是正六边形翻滚一次的情况。给定正六边形翻滚次数k,求A点翻滚轨迹长度

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 第一次旋转 πr/3,第二次旋转 √3πr/3,第三次旋转 2πr/3...以此类推

class Solution {public:    /**
     * 
     * @param k int整型 翻滚次数
     * @return double浮点型     */
    double circumference(int k)
{    double r[5]={1,sqrt(3),2,sqrt(3),1};    double l=0;    for(int i=0;i<k;i++)
    {
        l+=r[i%6]*acos(-1)/3.0;
    }    return l;
}
};

 

牛牛的分配

在牛牛面前有nnn个瓶子,每个瓶子的大小体积都一样,但是每个瓶子内的含水量都不相同。

因为牛牛是个完美主义者,他希望瓶子中的水能够满足他的要求,他的要求是瓶子中的水最少为xxx。所以他打算对这些瓶子里的水进行重新分配,以满足最多的瓶子中水量大于等于xxx。

牛牛的分配规则是:每次可以选择多个瓶子,将里面的水平均分配到已选择的瓶子中。

给定nnn个瓶子和牛牛的对瓶中的水量要求xxx,以及nnn个瓶子中的含水量,求最多可以有多少个瓶子满足牛牛的要求?    

思路

把原来的vector排个序,从大到小看,如果当前的水瓶中的水量大于x,s++,并且将多余的水分给下一个水瓶。

 class Solution {public:    /**
     * 返回重新分配后,满足牛牛要求的水量的瓶子最多的数量
     * @param n int整型 瓶子的数量
     * @param x int整型 牛牛的对瓶中的水量要求
     * @param a int整型vector 每个瓶子中的含水量
     * @return int整型     */
    int solve(int n,int x,vector<int> &a)
{
    sort(a.begin(),a.end());    int i,s=0;    for(i=a.size()-1;i>0;i--)
    {        if(a[i]>=x)
        {
            s++;
            a[i-1]+=a[i]-x;
        }
    }    if(a[0]>=x)
        s++;    return s;
}
};

牛牛构造等差数列

牛牛和牛妹在玩一个游戏,在他们面前有n个数,他们对每个数可以进行 +1 或 -1 操作,但对于每一个数,该操作最多只能执行一次。

游戏胜利的目标是:使用最少的操作次数,将这几个数构造成一个等差数列。

牛牛特别想赢得游戏,所以他想让你帮他写一个程序,得出最少多少次操作后能使这几个数变成一个等差数列,当然,如果完全不能构造成功,就输出-1。

class Solution {public:    /**
     * 返回最少多少次操作后能使这几个数变成一个等差数列,如果完全不能构造成功,就返回-1
     * @param n int整型 代表一共有n个数字
     * @param b int整型vector 代表这n个数字的大小
     * @return int整型     */int solve(int n, vector<int>& b)
{    if(n<=2)        return 0;        int s=0x7fffffff;        for(int i=-1;i<=1;i++)
        {            for(int j=-1;j<=1;j++)
            {                int first=b[0]+i;                int second=b[1]+j;                int d=first-second;                int now=second;                int cnt=abs(i)+abs(j);                for(int k=2;k<n;k++)
                {
                    now-=d;                    if(abs(now-b[k])<=1)
                        cnt+=abs(now-b[k]);                    else
                        break;                    if(k==n-1)
                        s=min(cnt,s);
                }
            }
        }    if(s<0x7fffffff)        return s;        return -1;
}
};

 

playfair

牛牛想给牛妹写信,但是牛牛怕信中的信息泄露出去,于是用playfair加密信息。加密过程中的j都由i来代替。playfair加密算法首先需要绘制密码表,密码表是一个5*5的矩阵,开始由密钥按顺序排列,其余按照未出现的字母顺序。若密钥中含有重复字母需要将重复字母去掉,若有j用i来代替,例如密钥为nowcoder,得到的密码表为watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

加密明文需要符合以下规则:

  1. 将明文中每两个字母组成一对,若成对后是两个相同字母或留下一个字母无法成对,则不进行变化直接放入密文中
  2. 明文对p1p2在同一行,对应密文对c1c2分别为紧靠p1p2右端的字母,最后一列右端对应第一列。例如明文对为rf,对应密文对为ae
  3. 明文对p1p2在同一列,对应密文对c1c2分别为紧靠p1p2下方的字母,最后一行下方对应第一行。例如明文对为rv,对应密文对为ho
  4. 明文对p1p2不在同一行且不在同一列,对应密文对c1c2分别为p1p2确定的矩形中的同行另外两角,例如明文对为hb,对应密文对为kr

现在牛牛告诉你密钥和明文你能告诉牛牛密文是什么吗?

 

标签:int,S1,编程,牛牛,明文,瓶子,牛客,整型,密文
来源: https://blog.51cto.com/u_15220686/2806814