新生周赛2019/11/23题解

A Fenoix超厌恶xxx
简单题:
题意:一个字符串中不能出现三个x,出现则要删除一个,如果都没有则输出0,否则,打印删除的次数。
按题意枚举即可,只要连续出现三个x,那么就删除一个,删除次数即答案。

#include <bits/stdc++.h>
using namespace std;
const int MM=1e6+5;
char s[MM];
int main()
{
   
    int t;
    cin>>t;
    cin>>s;
    int len=strlen(s);
    int sum=0;
    for(int i=0; i<len; i++)
    {
   
        if(s[i]=='x'&&s[i+1]=='x'&&s[i+2]=='x')
        {
   
            sum++;
        }
    }
    cout<<sum;
    return 0;
}

B 来呀,贪心呀~
原题
LJN学长就是考查你们学过的知识是否会,做过的题目是否都能做出了来。

做不出来就该反思一下自己。

C Fenoix的趣事

难度:简单
题意:两个队伍,分别代表为0,1,不能出现有七个或者七个以上的人占在一起。
枚举即可。
出现连续0或者1超过大于等于7即为NO,否则为YES。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   
	string z_o;
	int Count, length, Max;
	char cur;
	cin >> z_o;
		length = z_o.size();
		cur = z_o[0];
		Max = Count = 1;
		for(int i = 1; i < length; i++)
		{
   
			if(z_o[i] == cur)
				Count++;
			else
			{
   
				cur = z_o[i];
				Count = 1;
			}
			if(Count > Max)
				Max = Count;
		}
		if(Max >= 7)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	return 0;
}

也可以这样写

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int M=1e3+5;
char p[M];
int main ()
{
   
    scanf("%s",p);
    int i,n,flag=0;
    n=strlen(p);
    for(i=6; i<n; i++)
    {
   
        if((p[i]=='0'&&p[i-1]=='0'&&p[i-2]=='0'&&p[i-3]=='0'&&p[i-4]=='0'&&p[i-5]=='0'&&p[i-6]=='0')
                ||(p[i]=='1'&&p[i-1]=='1'&&p[i-2]=='1'&&p[i-3]=='1'&&p[i-4]=='1'&&p[i-5]=='1'&&p[i-6]=='1'))
        {
   
            flag=1;
            break;
        }

    }
    if(flag==0)
        cout<<"NO"<<endl;
    else
        cout<<"YES"<<endl;
    return 0;
}

D lwm学姐的木屋
难度:中等
思路题
解题思路:将木板从大到小排序后粘在一起的取大的矩阵。

#include <bits/stdc++.h>
using namespace std;
int a[1005];
bool cmp(int x,int y)
{
   
    return x>y;
}
int main()
{
   
    int k;
    cin>>k;
    while(k--)
    {
   
        int n;
        cin>>n;
        int i,sum=0;
        for(i=0; i<n; i++)
        {
   
            scanf("%d",&a[i]);
        }
        sort(a,a+n,cmp);
        for(i=0; i<n; i++)
        {
   
            if(sum<a[i])
            {
   
                sum++;
            }
            else
            {
   
                break;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

也可以这样写

#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
   
    int k;
    cin>>k;
    while(k--)
    {
   
        int n,i,temp=1;
        cin>>n;
        for(i=1; i<=n; i++)
        {
   
            cin>>a[i];
        }
        sort(a+1,a+1+n);
        int t=1;
        for(i=n; i>=1; i--)
        {
   
            if(a[i]/t>0)
            {
   
                temp=t;
                t++;
            }
            else
                break;
        }
        cout<<temp<<endl;
    }
    return 0;
}

E Fenoix的针对
难度:偏难
题意:按要求打印
规律简单,一看就懂。
找出规律,模拟即可
//right
//down
//left
//down
//right
//up

#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1e2+5;
int p[N][N];
void PrintMatrix(int y)
{
   
    int row=2, colum=2,n=1;
    int i=1, j=0;
    int ix;
    while (1)
    {
   
//right
        while(j<colum)
            p[i][++j]=n++;
        colum++;
//down
        while(i<row)
            p[++i][j] = n++;
        row++;
//left
        while(j>1)
            p[i][--j] = n++;
        if (row > y)
            break;
//down
        while(i<row)
            p[++i][j] = n++;
        row++;
//right
        while(j<colum)
            p[i][++j] = n++;
        colum++;
//up
        while(i>1)
            p[--i][j] = n++;
        if (colum > y)
            break;
    }
    for (i=1; i<=y; i++)
    {
   
        for (j=1; j<=y; j++)
            printf("%2d ", p[i][j]);
        printf("\n");
    }
}
int main()
{
   
    int s;
    while(cin>>s){
   
    //mem(p,0);
    PrintMatrix(s);
    printf("\n");
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
   
    int a[110][110],n,i,j,z;
    while(cin>>n)
    {
   
        a[0][0]=1;
        for(i=1; i<n; i++)
            a[i][i]=a[i-1][i-1]+2*i;
        for(z=1; z<n; z++)
        {
   
            int t=z,t1=z;
            if(z%2==1)
            {
   
                while(t--)
                {
   
                    a[t][t1]=a[t+1][t1]-1;
                    a[t1][t]=a[t1][t+1]+1;
                }
            }
            else
            {
   
                while(t--)
                {
   
                    a[t][t1]=a[t+1][t1]+1;
                    a[t1][t]=a[t1][t+1]-1;
                }
            }
        }
        for(i=0; i<n; i++)
        {
   
            for(j=0; j<n; j++)
            {
   
                printf("%2d ", a[i][j]);
            }
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int p[105][105];
int main ()
{
   
    int n;
    while(~scanf("%d",&n))
    {
   
        int bu =0;
        int i,j,l,sum,flag=1;
        p[0][0]=1;
        bu=1;
        for(sum=0; sum<n/2; sum++)
        {
   
            for(i=0,j=2*sum+1; j<2*sum+2; j++)
            {
   
                bu++;
                p[i][j]=bu;
                if(bu==n*n)
                {
   
                    flag=0;
                    break;
                }
            }
            if(flag==0)
                break;
            for(j=2*sum+1,i=1; i<2*sum+1; i++)
            {
   
                bu++;
                p[i][j]=bu;
                if(bu==n*n)
                {
   
                    flag=0;
                    break;
                }
            }
            if(flag==0)
                break;
            for(i=1+sum*2,j=2*sum+1; j>=0; j--)
            {
   
                bu++;
                p[i][j]=bu;
                if(bu==n*n)
                {
   
                    flag=0;
                    break;
                }
            }
            if(flag==0)
                break;
            for(j=0,i=2*sum+2; j<2*sum+3; j++)
            {
   
                bu++;
                p[i][j]=bu;
                if(bu==n*n)
                {
   
                    flag=0;
                    break;
                }
            }
            if(flag==0)
                break;
            for(i=2*sum+1,j=2*sum+2; i>=0; i--)
            {
   
                bu++;
                p[i][j]=bu;
                if(bu==n*n)
                {
   
                    flag=0;
                    break;
                }
            }
            if(flag==0)
                break;
        }
        for(i=0; i<n; i++)
        {
   
            for(j=0; j<n; j++)
            {
   
                printf("%2d ",p[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

F 说是栈你会做么?
难度:中等偏难
造数据时造水了,很多人不太理解就过了。这题是栈知识考察。
题意
将ab串插入一个空串中,之后每次都是插入可以插人到任意一个位置。每次得到得到的结果都是好串。

#include <bits/stdc++.h>
using namespace std;
#define maxx 55
stack <int> st;
string s;
int main(void)
{
   
    while(cin>>s)
    {
   
        while(!st.empty())
        {
   
            st.pop();
        }
        for(int i=0; i<s.length(); i++)
        {
   
            //cout<<s[i]<<endl;
            if(!st.empty()&&st.top()=='a'&&s[i]=='b')
            {
   
                st.pop();
            }
            else
              st.push(s[i]);
        }
        if(st.empty())
            cout<<"Good"<<endl;
        else
            cout<<"Bad"<<endl;
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
stack<char> s;
int main()
{
   
    char a[60];
    cin>>a;
    int len;
    len=strlen(a);
    for(int i=0; i<len; i++)
    {
   
        if(s.size()!=0&&s.top()=='a'&&a[i]=='b')
            s.pop();
        else
            s.push(a[i]);
    }
    if(s.size()==0)
        cout<<"Good"<<endl;
    else
        cout<<"Bad"<<endl;
    return 0;
}

也可以用数组模拟

#include <bits/stdc++.h>
using namespace std;
char s[100005];
int main()
{
      scanf("%s",s);
    int k=strlen(s),i;
    for (i=0;i<k;i++)
    {
    
        if (s[i]=='b')
            break;
        if (s[i]=='a')
        {
   
            if (s[i+1]=='b')
            {
   
                i=i+1;
            }
            else
            if(s[k-1]=='b')
            {
   
                k--;
            }
            else
                break;
        }
    }
    if (i==k)
        printf("Good");
    else
        printf("Bad");
    return 0;
}

G cgy学长爱吃糖果
难度:偏难
思路题
如果总和为奇数,必定不可能构造。
否则总和为偶数,如果存在最大值>总和-最大值,那么必定无解 否则必定有解,解的构造方法是每次取次大的两个值每次减一即可。

#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
const int MM=1e5+6;
ll a[MM];
int main()
{
   
    int t;
    cin>>t;
    while(t--)
    {
   
        int n;
        cin>>n;
        mem(a,0);
        ll sum=0;
        int maxx=0;
        for(int i=0;i<n;i++)
        {
   
            cin>>a[i];
            sum+=a[i];
            if(maxx<a[i])
                maxx=a[i];
        }
        if(sum%2==0&&sum-maxx>=maxx)
            cout<<"NICE!!!"<<endl;
        else
            cout<<"****!!!"<<endl;
    }
    return 0;
}

H 我太难了
难度:简单
求阶乘

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll yy(int x)
{
   
    ll sum=1;
    for(int i=1;i<=x;i++)
    {
   
        sum*=i;
    }
    return sum;
}
int main()
{
   
    int t;
    cin>>t;
    while(t--)
    {
   
        int n;
        cin>>n;
        cout<<yy(n)<<endl;
    }
    return 0;
}

I 我也太难了
难度:简单
斐波那契数列,找出第k个斐波那契数。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int MM=1e5+6;
ll a[MM];
void yy()
{
   
    a[1]=1;
    a[2]=1;
    for(int i=3;i<=150;i++)
    {
   
        a[i]=a[i-1]+a[i-2];
    }
}
int main()
{
   
    int t;
    cin>>t;
    yy();
    while(t--)
    {
   
        int n;
        cin>>n;
        cout<<a[n]<<endl;
    }
    return 0;
}

J 来***oix的刁难
难度 中等
从右 到左枚举一下,把第一次出现的树标记一下,再从左到右输出。

#include <bits/stdc++.h>
using namespace std;
const int MM=1e6+5;
int s[MM];
int b[MM];
int main()
{
   
    int t;
    scanf("%d",&t);
    int sum=0;
    for(int i=0; i<t; i++)
    {
   
        scanf("%d",s+i);
    }
    for(int i=t-1;i>=0;i--)
    {
   
        for(int j=i-1;j>=0;j--)
        {
   
            if(s[i]==s[j])
            {
   
                s[j]=0;
            }
        }
    }
    int yy=0;
    for(int i=0;i<t;i++)
    {
   
        if(s[i]!=0){
   
            sum++;
            b[yy++]=s[i];
        }
    }
    printf("%d\n",sum);
    for(int i=0; i<sum; i++)
    {
   
           cout<<b[i]<<" ";
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
   
    int n,a[100];
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>a[i];
    for(int i=n-1; i>=0; i--)
    {
   
        if(a[i]==0)
            continue;
        for(int j=i-1; j>=0; j--)
        {
   
            if (a[j]!=0&&a[i]==a[j])
                a[j]=0;
        }
    }
    int sum=0;
    for(int i=0; i<n; i++)
        if(a[i]!=0)
            sum++;
    cout<<sum<<endl;
    for(int i=0; i<n; i++)
        if(a[i]!=0)
        {
   
            cout<<a[i]<<' ';
        }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
int s[10005];
int ss[10005];
int main()
{
   
    int a,ans=1,k;
    scanf("%d",&a);
    for (int i=1; i<=a; i++)
    {
   
        scanf("%d",&s[i]);
    }
    for (int j=a; j>=1; j--)
    {
   
        for (k=1; k<=ans; k++)
            if (s[j]==ss[k])
                break;
        if (k==ans+1)
        {
   
            ss[ans+1]=s[j];
            ans++;
        }
    }
    printf("%d\n",ans-1);
    for (int g=ans; g>1; g--)
        printf("%d ",ss[g]);
    return 0;
}

K Fenoix的签到题
难度:简单
找出最长连续的递增序列
枚举即可。

#include <bits/stdc++.h>
using namespace std;
#define meme(a,b) memset(a,b,sizeof(a))
const int MM=1e5+5;
int a[MM];
int t;
int main()
{
   
    cin>>t;
    for(int i=0; i<t; i++)
        cin>>a[i];
    int sum=a[0];
    int maxx=0;
    int ans=1;
    for(int i=1; i<t; i++)
    {
   
        if(a[i]>sum)
        {
   
            ans++;
        }
        else
        {
   
            ans=1;
        }
        if(maxx<=ans)
            maxx=ans;
        sum=a[i];
    }
    cout<<maxx<<endl;
    return 0;
}

L 防AK题目——超难系列

签到题
直接打印即可

全部评论

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务