第三次周赛题目总结

题目总链接:

https://nuoyanli.com/contest/31/problems

A.我是个签到题!

题目链接:
https://nuoyanli.com/contest/31/problem/A
题面:
在这里插入图片描述
题意:
题目意思相当简单,就是判断是否存在整数满足这个等式,如果存在就输出YES,不存在就NO。
思路:
这道题目就是费马大定理,自行百度。此处不做解释。
参考代码:

#include<stdio.h>
int main()
{
  printf("NO");
  return 0;
}

B.我是简单题!

题目链接:
https://nuoyanli.com/contest/31/problem/B
题面:
在这里插入图片描述
题意:
输入一个t代表t组输入,每组输入初始幸福值m,和每次减低的幸福值k,然后输入点赞人数和字符s,判断接下来的n行中人的名字是以字符s开头或者结尾就帮忙点赞(当幸福值降为0或者小于0就不会继续帮忙点赞)
思路:
这道题目整体没有很难,我们先对名字以字符s开头或者结尾的人名进行点数,判断这个人最多帮多少人点赞,然后在通过一个for来判断幸福值是否支持他将这些人全部点赞完。
参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int m,k,n,ans=0,i,len,sum=0;
        char ch;
        char a[1000];
        scanf("%d%d%d ",&m,&k,&n);
        scanf("%c",&ch);
        for(i=0;i<n;i++)
        {
            scanf("%s",a);
            len=strlen(a);
            if(a[0]==ch||a[len-1]==ch)//判断字符串的开头和结尾是否存在与输入的字符相同
            {
                ans++;//判断不考虑幸福值的情况下,需要帮助的总人数。
            }
        }
        sum=m;
        for(i=0;i<ans;i++)
        {
            sum=sum-k;
            if(sum<=0)//判断初始幸福值能够支持帮助几个人
            {
                ans=i+1;
            }
        }
        if(m==0) ans=0;
        if(ans!=0)
        printf("%d\n",ans);
        else printf("NICE DAY!\n");

    }
    return 0;
}

C.我才是简单题!

题目链接:
https://nuoyanli.com/contest/31/problem/C
题面:
在这里插入图片描述
题意:
多组输入,每行输入一个整数n,第二行有n个整数代表每种布的价格,然后输出需要买完所有布的最低消费。
思路:
这个题目中买布的规则为提前去买没有出场的布,就需要将布的价格乘以天数,而我们需要花费最少,钱为正值的一定会按顺序买,这样子是最划算的情况,而为负数的肯定是先买最后出现的,这时候如果为负数的就直接乘以他出现时的天数,而为正数的话就直接为他的价格。这时候就是消费最小的情况。(题目数据给的特别大,这时候我们需要使用long long 形的数据类型)。
参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    long long  n;
    while(scanf("%lld",&n)!=EOF)
    {
        long long a,i;
        long long sum=0;
        for(i=1; i<=n; i++)
        {
            scanf("%lld",&a);
            if(a<0)//判断价格是否小于0
            {
                sum=sum+a*i;//小于则直接乘以他出现时的天数
            }
            else sum=sum+a;//为正数就直接价格相加
        }
        printf("%lld\n",sum);
    }
}

D.暴力我啊!

题目链接:
https://nuoyanli.com/contest/31/problem/D
题面:
在这里插入图片描述
题意:
多组输入,每行输入一个n,m,接下来n行每行n个整数,表示第几行第几列存在多少个敌人。然后选择m*m的范围继续轰炸,求最多能够击杀的敌人人数。
思路:
这道题目暴力就对了,可以直接4层for循环,也可以向我这样用两个while和两个for,就是先每次不断向右边平移,然后在回到初始地点向下平移,之后在向右边平移。然后对每种轰炸情况的人数进行排序,输出最大值。
参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
    return a>b;//定义一个函数使得sort从大到小排序
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int i,j;
        int a[n+10][n+10];
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        int x,y,o=0,p=0,k;
        int b[10000];
        for(i=0; i<10000; i++)
        {
            b[i]=0;
        }
        x=m;
        y=m;
        k=0;
        while((x+o)<=n)
        {
            p=0;//将列重新从0开始又右边平移
            while((y+p)<=n)
            {
                for(i=o; i<n; i++)
                {
                    for(j=p; j<n; j++)
                    {
                        if(j<y+p&&i<x+o)
                        {
                            b[k]=b[k]+a[i][j];
                        }
                    }
                }
                p=p+1;//不断向右平移一格
                k=k+1;
            }
            o=o+1;//当向右平移到n时,这时候向下平移一格
        }
        sort(b,b+k,cmp);//对每种情况的轰炸人数进行从大到小的排序
        printf("%d\n",b[0]);

    }
    return 0;
}

E.暴力啥啊!

题目链接:
https://nuoyanli.com/contest/31/problem/E
题面:
在这里插入图片描述
题意:
多组输入,每组第一行给一个整数n,接下来一行有n个整数输入,判断哪两个点的斜率最大。
思路:
这道基本思路就是求这些点当中的最大斜率,我们可以通过画三角形可以看出来,斜率最大的一定是相邻两个点之间,所以这道题目我们只需要枚举相邻两点之间的斜率大小进行比较,输出最大的那个斜率即可。
参考代码:

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        double maxn = -2e9-5, a, b;//将最大值的初始值定义到足够小
        scanf("%lf",&a);
        while(--n)//进行n-1次循环
        {
            scanf("%lf",&b);
            if(b-a > maxn)
            {
                maxn = b-a;
            }
            a = b;
        }
        printf("%.2lf\n",maxn);
    }
    return 0;
}

F.我也是个签到题!

题目链接:
https://nuoyanli.com/contest/31/problem/F
题面:
在这里插入图片描述
题意:
输入一个正整数T,代表有T组输入,每次输入就一个整数n,然后判断这个数字n的十二进制,十六进制,十进制的各位数相加相等。如果相等就满足特别的三位数,则输出Specializ!!!,否则就输出disappointment…。

思路:
这个题目与计算十进制的各位相加之和基本类似,就是通过不断求余与除法来求出每一位,然后相加,最后判断是否是否都是相等的就可以了。
参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int k,m,n,o,sum=0,sum1=0,sum2=0,x,l;
        scanf("%d",&n);
        k=n;
        m=n;
        x=n;
        while(k!=0)
        {
            o=k%16;
            sum=sum+o;
            k=k/16;
        }//十六进制的各位数之和
        while(m!=0)
        {
            l=m%12;
            sum1=sum1+l;
            m=m/12;
        }//十二进制的各位数之和
        while(x!=0)
        {
            o=x%10;
            sum2=sum2+o;
            x=x/10;
        }//十进制的各位数之和
        if(sum1==sum2&&sum2==sum)//判断是否相等
        {
            printf("Specializ!!!\n");
        }
        else
            printf("disappointment....\n");
    }
    return 0;
}

G.我才是个签到题!

题目链接:
https://nuoyanli.com/contest/31/problem/G
题面:
在这里插入图片描述
题意:
首先输入一个n,代表n个同学,之后n行依次输入一个学生的姓名,学号,性别。之后输入一个m,代表询问的问题,之后m行输入两个信息(姓名或者学号)如果这两个信息对应的人为性别不同就可以一起玩游戏,输出Y,如果对应的人性别相同,则输出n。
思路:
这道题目考察我们的是结构体的应用以及strcmp应用
注:strcmp为字符串函数,使用他时头文件中应该有#include<string.h>,然后strcmp的基本格式为strcmp( a,b),a,b为字符串,如果a<b则返回负数,如果a=b则返回0,如果a>b则返回正数。所以判断两个字符串是否相等就只需要判断strcmp(a,b)==0 ,如果为0则两个字符串相等。
我们定义一个结构体将一个学生的基本信息存储在一个结构体中,然后输入,之后输入的m组两个人的信息我们可以进行依次检索,使用strcmp来判断各个信息对应的人,然后同时进行比较对应的人的性别,从而来判断是否可以一起玩游戏。

参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct p
{
    char m[100];//姓名
    char x[100];//学号
    char xing[100];//性别
} a[1100];
int main()
{
    int n,i,m;
    char b[1000];
    char c[1000];
    char u[1000];
    char k[1000];
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%s %s %s",a[i].m,a[i].x,a[i].xing);
    }
    scanf("%d",&m);
    while(m--)
    {
        scanf("%s %s",b,c);
        for(i=0; i<n; i++)//对其进行检索
        {
            if(strcmp(b,a[i].m)==0||strcmp(b,a[i].x)==0)//来判断后面输入的信息所对应的人
            {
                u[0]=a[i].xing[0];//将对应的人的性别赋值给一个字符串
            }
            if(strcmp(c,a[i].m)==0||strcmp(c,a[i].x)==0)
            {
                k[0]=a[i].xing[0];
            }
        }
        if(u[0]!=k[0])//判断所对应两个人的性别是否相同
        {
            printf("Y");
        }
        else
            printf("n");
        if(m!=0) printf("\n");
    }
    return 0;
}

H.巧了,我是真正的签到题!

题目链接:
https://nuoyanli.com/contest/31/problem/H
题面:
在这里插入图片描述
题意:
这道题目就是一个简单的if判断的简单题
思路:
我们就是不断使用if来判断输入的字符属于哪个数字就行了。
参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int i,len;
        char a[1000];
        scanf("%s",a);
        len=strlen(a);
        for(i=0;i<len;i++)
        {
            if(a[i]=='a'||a[i]=='b'||a[i]=='c')
            {
                printf("2");
            }
              else if(a[i]=='e'||a[i]=='f'||a[i]=='d')
            {
                printf("3");
            }
              else if(a[i]=='h'||a[i]=='i'||a[i]=='g')
            {
                printf("4");
            }
              else if(a[i]=='j'||a[i]=='k'||a[i]=='l')
            {
                printf("5");
            }
              else if(a[i]=='m'||a[i]=='n'||a[i]=='o')
            {
                printf("6");
            }
              else if(a[i]=='p'||a[i]=='q'||a[i]=='r'||a[i]=='s')
            {
                printf("7");
            }
              else if(a[i]=='t'||a[i]=='u'||a[i]=='v')
            {
                printf("8");
            }
              else if(a[i]=='w'||a[i]=='x'||a[i]=='y'||a[i]=='z')
            {
                printf("9");
            }
            else
            {
                printf("1");
            }

        }
        if(n!=0) printf("\n");
    }
    return 0;
}

I.我是个防AK题你信吗?

题目链接:
https://nuoyanli.com/contest/31/problem/I
题面:
在这里插入图片描述
题意:
输入一个T,代表T组输入,然后输入一个字符串,判断这个字符串中字符能够组成多少个lwp。
思路:
这道题目的基本思路就是一个简单的if,我们通过用for来一个个继续判断,然后统计大小写的l与大小写的w还是大小写的p的数目,然后判断数目最少的那种,就是可以组成的lwp的数目。
参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int b[10];
        char a[10000];
        int len,i,j,m=0,p=0,k=0;
        scanf("%s",a);
        len=strlen(a);
        for(i=0;i<len;i++)
        {
            if(a[i]=='l'||a[i]=='L')
            {
                m++;//计算出现大小写的l的次数
            }
            if(a[i]=='w'||a[i]=='W')
            {
                k++;//计算出现大小写的w的次数
            }
            if(a[i]=='p'||a[i]=='P')
            {
                p++;//计算出现大小写的p的次数
            }
        }
        b[0]=m;
        b[1]=k;
        b[2]=p;
        sort(b,b+3);//对lwp各个字符出现的次数继续从小到大排序
        printf("%d\n",b[0]);//输出出现次数最少的那个,就是组成lwp的数目
    }
    return 0;
}

J.听取wa声一片

题目链接:
https://nuoyanli.com/contest/31/problem/J
题面:
在这里插入图片描述
题意:
题目意思十分简单,就是输出不换箱子得到宝箱的概率,和换了箱子得到宝箱的概率,中间用空格隔开,保留3位小数。
思路:
这道题目基本思路就是概率问题,因为主持人是知道宝箱在哪个箱子的,他一定会先看没有宝箱的箱子,这时候我们不需要考虑主持人开的是哪个箱子,就3个箱子中就存在一个宝箱,直接拿到宝箱的概率就是三分之一,而换箱子得到宝箱和不换箱子得到宝箱是对立的两个事件,所以当不换箱子得到宝箱的概率为三分之一时,另一种情况的答案就为三分之二。
参考代码:

#include<stdio.h>
int main()
{
    printf("0.333 0.667");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kunyuwan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值