2019级ACM第一次招新赛题解:

A:我是签到题
说是签到题,其实有点思路,这道题爆了long long,所以需要用char s[] ,len=strlen(s)和需要删除n个数

92081346718538 10
以这个样例为例:
9 2 0 8 1 3 4 6 7 1 8 5 3 8 
from[0,10]查找max=9 id=0 id++=1  n++=11
from[1,11]查找max=8 id=3 id++=4  n++=12
from[4,12]查找max=8 id=10 id++=11 n++=13
from[11,13]查找max=8 id=13 id++=14 n++=14
answer:9888

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
char s[maxn];
int main()
{
    int n;
    while(~scanf("%s %d",s,&n))
    {
        int m=strlen(s);
        int id=0;
        while(n<m)
        {
            for(int i=id; i<=n; i++)//总共找m-n次
            {
                if(s[id]<s[i])
                {
                    id=i;//使前区间不影响以后的区间
                }
            }
            printf("%c",s[id]);
            id++;//每次更新区间
            n++;
        }
        printf("\n");
        memset(s,0,sizeof(s));
    }
}

B:圈钱杯
可能是我理解能力不太好,感觉题挺难读的v_v
题意:判断给定的n个比赛中的题量,从中选择比赛,让比赛题的数量尽可能的大于天的序号即可,求得训练最大天数
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 20005
int a[maxn],n;
void slove()
{
    sort(a+1,a+n+1);
    int ans=0;
    int id=1;
    for(int i=1; i<=n; i++)
    {
        if(id<=a[i])
        {
            id++;
            ans++;
        }
    }
    printf("%d\n",ans);
}
int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    slove();

}

C:我才是真正的签到题
题解:这题可能对于现在的新生来说很难,但是其实就是一个板题吧,不多说直接看代码
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
string add(string s1,string s2)
{

    int j,l,la,lb;
    string ma,mi;
    ma=s1;
    mi=s2;
    if(s1.length()<s2.length())
    {
        ma=s2;
        mi=s1;
    }
    la=ma.size();
    lb=mi.size();
    l=la-1;
    for(j=lb-1; j>=0; j--,l--)
        ma[l] += mi[j]-'0';
    for(j=la-1; j>=1; j--)
        if(ma[j]>'9')
        {
            ma[j]-=10;
            ma[j-1]++;
        }
    if(ma[0]>'9')   //处理第一位超过9了。
    {
        ma[0]-=10;
        ma='1'+ma;
    }
    return ma;
}
int main()
{

      string s[maxn];
      s[1]="1";
      s[2]="3";
      for(int i=3;i<=255;i++)
      {
          s[i]=add(s[i-1],s[i-2]);
      }
      int n;
     while(~scanf("%d",&n))
     {
     printf("%s\n",s[n].c_str());
     }

}

D:签到不签到他们说了不算
题意有点扯,看不懂在说啥,还好有提示
做法:找一下*的最大,最小坐标围城的空间,然后更改该空间中的.*
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
#define inf 0x3f3f3f3f
char s[maxn][maxn];
int n;
void draw_p()
{
    for(int i=0; i<n; i++)
    {
        scanf("%s",s[i]);//输入图形
    }
    int len=strlen(s[1]);
    int min_idx=inf,min_idy=inf,max_idx=~inf,max_idy=~inf;//寻找边界
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<len; j++)
        {
            if(s[i][j]=='*')
            {
                min_idx=min(min_idx,i);
                min_idy=min(min_idy,j);
                max_idx=max(max_idx,i);
                max_idy=max(max_idy,j);
            }
        }
    }
    for(int i=min_idx; i<=max_idx; i++)//更改边界内空间图形
    {
        for(int j=min_idy; j<=max_idy; j++)
        {
            if(s[i][j]=='.')
            {
                s[i][j]='*';
            }
            else
            {
                s[i][j]='.';
            }
        }
    }
    for(int i=0; i<n; i++)//输出图形
        printf("%s\n",s[i]);
    printf("\n");
}
int main()
{
    while(~scanf("%d",&n))
    {
        draw_p();
    }
}

E:wr学姐的小调查
题解:这题真的很水,不会写的,要自己反思一下了
我懒得写了,直接copy一个代码,改一下好了:
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn  1005
#define sizex 35
struct node
{
    char s[sizex];
    int y;
    int m;
    int d;
} temp[maxn];
bool cmp( node a,node b)
{
    if(a.y==b.y)
    {
        if(a.m==b.m)
        {
            return a.d>b.d;
        }
        else
            return a.m>b.m;
    }
    else
        return a.y>b.y;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%s",temp[i].s);
        scanf("%d %d %d",&temp[i].y,&temp[i].m,&temp[i].d);
    }
    sort(temp,temp+n,cmp);
    for(int i=n-1; i>=0; i--)
    {
        printf("%s\n",temp[i].s);
    }
}

F:小仙女的烦恼
学姐出这么水一道题,没有过的,应该反思一下,之后该更加努力了
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
char s[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int t=n;
        bool id=false;//默认没女生超过120
        while(t--)
        {
            int weigh;
            scanf("%d %s",&weigh,s);
            if(s[0]=='w'&&weigh>120)
            {
               id=true;//事实有女生超过120
            }
        }
        if(id)
        {
            printf("hhh\n");
        }
        else
        {
            printf("yyy\n");
        }
    }
}

G:pxj爱喝可乐
给新生的签到题,把心里所想模拟出来即可
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
int main()
{
    int n;
    //喝可乐,贪心写一下即可
    while(~scanf("%d",&n)&&n)
    {
        int id=0;
        int sum=n;
        while(n--)
        {
            id++;
            if(id%4==0)
            {
                n++;
                sum++;
                id=0;
            }
        }
        printf("%d\n",sum);
    }
}

H:鬼王的质问
一道很难的题,并且话很绕,用结构体可以写,不过需要活用link[],用link[]记录小弟,再利用前缀和将小弟能力叠加到大哥身上,再结构体快排,再判断就行了
记录写法:

 memset(link,-1,sizeof(link));
 for(int i=link[_id]; i!=-1; i=link[i])
            {
         
            }
      sum[i]+=sum[link[i]]//链式的前缀

题不难,但需要好好理解,题意,代码就copy别人的吧,思路就这么个思路
AC代码:

#include <iostream>
#include <vector>
#include <memory.h>
#include <map>
#include <algorithm>
#include <time.h>
#include <cstdio>
#include<map>
using namespace std;
#define maxx 100
#define minn 1

struct xxx
{
    int a;
    int xb;
    int fu;
} an[100];
struct yyy
{
    int fu;
} bn[100];
bool cmp(xxx a,xxx b)
{
    return a.a>b.a;
}
int main()
{

    int N,M,Q;
    while(~scanf("%d %d %d",&N,&M,&Q))
    {
        memset(bn,0,sizeof(bn));
        memset(an,0,sizeof(an));
        for(int i=1; i<=N; i++)
        {
            scanf("%d %d",&an[i].xb,&an[i].a);
        }
        
        for(int i=1; i<=M; i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            an[b].fu=a;
            bn[b].fu=a;
            while(an[a].fu!=0)//把每个的值加上
            {
                an[a].a+=an[b].a;
                a=an[a].fu;
            }
            an[a].a+=an[b].a;
        }
        
        sort(an+1,an+N+1,cmp);

        for(int i=0; i<Q; i++)
        {
            int a,b;
            scanf("%d",&a);
            for(int i=1; i<=N; i++)
            {
                if(an[i].xb==a)
                {
                    b=i;
                    break;
                }
            }
            if(b<=12)
            {
                if(bn[a].fu)
                    printf("aaaaa\n");
                else
                {
                    if(b>=8)
                        printf("aaaaa\n");
                    else if(b==7)
                        printf("hhhhh\n");
                    else
                        printf("~~~~~\n");
                }
            }
            else
            {
                while(bn[a].fu)
                {
                    a=bn[a].fu;
                    for(int i=1; i<=N; i++)
                    {
                        if(an[i].xb==a)
                        {
                            b=i;
                            break;
                        }
                    }
                    if(b<=12)
                        break;
                }
                for(int i=1; i<=N; i++)
                {
                    if(an[i].xb==a)
                    {
                        b=i;
                        break;
                    }
                }
                if(b<=12)
                {
                    if(bn[a].fu)
                        printf("aaaaa\n");
                    else
                    {
                        if(b>=8)
                            printf("aaaaa\n");
                        else if(b==7)
                            printf("hhhhh\n");
                        else
                            printf("~~~~~\n");
                    }
                }
                else
                    printf("~~~~~\n");
            }

        }

    }

}

I:WAAAAA
这题是一个简单的模拟题,利用结构体进行一波操作即可。
题解:记录每个人AC的题量,记录每个人的罚时,当题量相等时,按罚时低的排序,否则按题量多的排序
AC代码:

#include<bits/stdc++.h>
using namespace std;
//cxk&&qbl
#define maxn 100005
#define pub_t  20
#define num 15
char s[maxn];
struct node
{
    int id;//序号
    int ans_n;//题量
    int run_t;//总时间
    int sum[num];//罚时
    int judge[num];//判断该题是否通过
} temp[maxn];
bool cmp(node x,node y)
{
    if(x.ans_n==y.ans_n)//如果题量一样按照罚时排序
    {
        return x.run_t<y.run_t;
    }
    return x.ans_n>y.ans_n;//否则按题量排序
}
int main()
{
    int n,m,k;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(temp,0,sizeof(temp));
        scanf("%d %d %d",&n,&m,&k);
        int a,b,c;
        for(int i=1; i<=k; i++)
        {
            scanf("%d %d %d %s",&a,&b,&c,s);
            temp[b].id=b;//每个人的id
            if(s[0]=='A'&&(!temp[b].judge[c]))
            {
                temp[b].judge[c]=1;//该题通过
                temp[b].run_t+=(temp[b].sum[c]+a);
                temp[b].ans_n++;
            }
            else
            {
                temp[b].sum[c]+=pub_t;
            }
        }
        sort(temp+1,temp+1+n,cmp);
        if(temp[1].id==1)
            printf("WAAAAA\n");
        else
            printf("%d\n",temp[1].id);

    }
}

J:智斗南工白嫖王
一道简单题,把十六进制中的1--15转化成二进制拼接起来就行了,理解进制转化的运算即可
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
char s[1005];
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%s", s);
        int n = strlen(s);
        for(int i = 0; i < n; i++)
        {
            switch(s[i])
            {
            case '0':
                printf("0000");
                break;
            case '1':
                printf("0001");
                break;
            case '2':
                printf("0010");
                break;
            case '3':
                printf("0011");
                break;
            case '4':
                printf("0100");
                break;
            case '5':
                printf("0101");
                break;
            case '6':
                printf("0110");
                break;
            case '7':
                printf("0111");
                break;
            case '8':
                printf("1000");
                break;
            case '9':
                printf("1001");
                break;
            case 'A':
                printf("1010");
                break;
            case 'B':
                printf("1011");
                break;
            case 'C':
                printf("1100");
                break;
            case 'D':
                printf("1101");
                break;
            case 'E':
                printf("1110");
                break;
            case 'F':
                printf("1111");
                break;
            }
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值