链接: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;
}
};