牛客编程巅峰赛S1第2场 - 青铜&白银 A.模拟 B.前缀和 C.容斥

链接:https://ac.nowcoder.com/acm/contest/6219/A
来源:牛客网
A
题目描述
牛牛现在有n张扑克牌,每张扑克牌都有点数和花色两部分组成。点数为‘1’-‘9’的正整数,花色为’C’,‘D’,‘H’,‘S’'其中的一个,分别表示梅花、方块、红桃、黑桃。现在牛牛想按一定的顺序把这n张牌扔掉。扔牌顺序的规则如下1.:
1.如果现在还剩素数张牌,则将牌顶的牌扔掉
2.如果现在还剩非素数张牌,则将牌底的牌扔掉
牛牛想知道他的扔牌顺序是什么,请返回扔牌顺序的字符串

示例1
输入
复制
“3C8D6H3D”
输出
复制
“3D3C8D6H”
说明
开始n=4,为非素数,扔掉牌底的牌3D
n=3,为素数,扔掉牌顶的牌3C
n=2,为素数,扔掉牌顶的牌8D
n=1,为非素数,扔掉牌底的牌6H
示例2
输入
复制
“8S8S8S8S8S8S8S”

class Solution {
public:
    /**
     * 
     * @param x string字符串 字符串从前到后分别是从上到下排列的n张扑克牌
     * @return string字符串
     */
    struct node{
   char su,se;
  }no[10005];
bool is(int x){
    if(x<2)return 0;
    for(int i=2;i*i<=x;i++){
        if(x%i==0)return 0;
    }
    return 1;
}
    string Orderofpoker(string s) {
        int cnt=0;
    for(int i=0;i<s.size();i++){
        if(s[i]>='0'&&s[i]<='9'){
            cnt++;
            no[cnt].su=s[i];
            no[cnt].se=s[i+1];
        }
    }
    int i=1,j=cnt;
       string res="";
    while(cnt){
       if(is(cnt)){
          res+=no[i].su;
           res+=no[i].se;
          i++;
          cnt--;
       }
       else {
            res+=no[j].su;
           res+=no[j].se;
          j--;
          cnt--;
       }
    }
        return res;
    }
};

B
链接:https://ac.nowcoder.com/acm/contest/6219/B
来源:牛客网

题目描述
今天牛牛去游乐园玩过山车项目,他觉得过山车在上坡下坡的过程是非常刺激的,回到家之后就受到启发,想到了一个问题。如果把整个过山车的轨道当作是一个长度为n的数组num,那么在过山车上坡时数组中的值是呈现递增趋势的,到了最高点以后,数组中的值呈现递减的趋势,牛牛把符合这样先增后减规律的数组定义为金字塔数组,请你帮牛牛在整个num数组中找出长度最长的金字塔数组,如果金字塔数组不存在,请输出0。

示例1
输入
复制
4,[1,2,3,1]
输出
复制
4
示例2
输入
复制
5,[1,5,3,3,1]
输出
复制
3
备注:
1<=n<=1000000,且num数组中的数 0<=num[i]<=1000000。

class Solution {
public:
    /**
     *
     * @param n int整型
     * @param num int整型vector
     * @return int整型
     */
      int getMaxLength(int n, vector<int>& a) {
        // write code here
      vector<int>l(n,0),r(n,0);
        l[0]=0;
       for(int i=1;i<n;i++){
           l[i]=a[i]>a[i-1]?l[i-1]+1:0;
       }
        r[n-1]=0;
        for(int i=n-2;i>=1;i--){
            r[i]=a[i]>a[i+1]?r[i+1]+1:0;
        }
          int ans=-1;
          for(int i=0;i<n;i++){
              ans=max(ans,l[i]+r[i]+1);
          }
	   return ans;
       
    }
};

C
链接:https://ac.nowcoder.com/acm/contest/6219/C
来源:牛客网

题目描述
牛牛最近在家里看到一个棋盘,有nm个格子,在棋盘旁边还放着k颗棋子,牛牛想把这k颗棋子全部放在nm的棋盘上,但是有一个限制条件:棋盘的第一行、第一列、最后一行和最后一列都必须有棋子。牛牛想知道这样的棋子放法到底有多少种,答案需要对1e9+7取模。

示例1
输入
复制
2,3,1
输出
复制
0
说明
就1颗棋子,所以无法满足条件。
示例2
输入
复制
2,2,2
输出
复制
2
说明
我们可以把第1颗棋子放在左上角,第2颗棋子放在右下角;也可以把第1颗棋子放在右上角,第2颗棋子放在左下角。故而有2种放法。

class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @param m int整型 
     * @param k int整型 
     * @return int整型
     */
    const int mod=1e9+7;
    typedef long long ll;
    int c[1110][1110];
    void p(){
        for(int i=0;i<1005;i++){
            c[i][0]=c[i][i]=1;
        }
        for(int i=1;i<1005;i++){
            for(int j=1;j<i;j++){
                c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
            }
        }
    }
    int solve(int n, int m, int k) {
        // write code here
        p();
        int ans=0;
        for(int i=0;i<16;i++){
            int cnt=0;
            int row=n,col=m;
            if(i&1){
                cnt++;
                row--;
            }
            if(i&2){
                cnt++;
                col--;
            }
            if(i&4){
                cnt++;
                row--;
            }
            if(i&8){
                cnt++;
                col--;
            }
            if(cnt&1){
                ans=(ans-c[row*col][k]+mod)%mod;
            }
            else ans=(ans+c[row*col][k])%mod;
        }
        return ans;
        
        
    }
};

你可能感兴趣的:(牛客)