郑州轻工业大学第三次周赛题目总结

题目总链接:

http://acm.zzuli.edu.cn/contest.php?cid=1403

问题 A: 这个题目很简单的,快来做啊

题目链接:

http://acm.zzuli.edu.cn/problem.php?id=2553

题面:

在这里插入图片描述

题意:

一个整数T,代表样例个数(1<=T<=100)。每个样例包含一个n(1<=n<=10000),代表n次比赛,之后n行,每一行有两个数,分别是A和k,代表这次比赛做出了A道题,其中k道题被hack。输出T行,每行输出n次比赛AC题目的总量。

思路:

这道题目就是一个将每次比赛A的数值与hack的数值的差值进行累加,但是需要注意是所给数据的范围,所以我们要使用long long 型而不用int 型。

参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
    long long  T;
    scanf("%lld",&T);
    while(T--)//T组输入
    {
        long long  n,a,b,c,sum=0;
        scanf("%lld",&n);
        while(n--)
        {
            scanf("%lld%lld",&a,&b);
            c=a-b;//A的数值与hack的数值之差为ac的题目量
            sum=sum+c;//将其每次都相加
        }
        printf("%lld",sum);
        if(T!=0) printf("\n");
    }
    return 0;
}

问题 B: 最古老的树

题目链接:

http://acm.zzuli.edu.cn/problem.php?id=2554

题面:

在这里插入图片描述

题意:

一个n(0<n<=1000),代表盘点的树的数目, 接下来n个数字y,代表每棵树的年龄(0<y<=9500,y是整数)。输出次数出现最多的树龄,如果出现次数最多的树龄不止一个,就输出树龄小的那个。

思路:

这道题目的基本考察我们通过双重for循环来记数,同时用if 来判断出现次数的是哪一个,这道题目我们需要注意的是要特判出现次数相同的情况。因为题目要求当出现次数最多不止一个时,输出树龄较小的。使用要对此进行判断。

参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
   int n,b,i,j,ans=0,m=-1;
   int a[10000];
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
       scanf("%d",&a[i]);
   }
   for(i=0;i<n;i++)
   {
       ans=0;
       for(j=0;j<n;j++)
       {
           if(a[i]==a[j])
           {
               ans++;//记录每种树龄出现的次数
           }
       }
       if(ans>m)//对树龄出现的次数的大小进行判断
       {
           m=ans;
           b=a[i];
       }
       else if(ans==m)//特判两个出现次数相同的情况
       {
           if(a[i]<b)
           {
               b=a[i];//将输出值赋值为树龄较小的那个
           }
       }
   }
   printf("%d",b);
}

问题 C: Kokoa的咖啡聚会

题目链接:

http://acm.zzuli.edu.cn/problem.php?id=2555

题面:

在这里插入图片描述

题意:

多组输入,每组样例第一行包含三个正整数x,y和z(1<=x,y,z<=100000)——Mocca、Latte和Macchiato想喝咖啡的数量,第二行包含三个正整数a,b和c(1<=a,b,c<=100000)——Kokoa家里的摩卡、拿铁、玛奇朵的数量。然后mocca只喝摩卡,latte除了玛奇朵不喝,其他都喝,macchiato什么咖啡都喝。如果给出的三种咖啡数量能让所有人都心满意足,则输出"YES",否则输出"NO"

思路:

这道题目我们是想让所有人都心满意足,所以我们肯定是先让有要求的先选,所以这道题目肯定是mocca先选摩卡去喝,然后latte在选择,最后才是macchiato去选择,我们就可以通过if嵌套来实现,先判断mocca的量是否足够,然后减去mocca选择的,继续判断latte需要的量是否满足。就这样子一步一步进行判断。

参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
    long long x,y,z,d,e;
    while(scanf("%lld%lld%lld",&x,&y,&z)!=EOF)
    {
        long long a,b,c,d,e;
        scanf("%lld%lld%lld",&a,&b,&c);
        d=a+b;
        e=a+b+c;
        if(a>=x)//判断是否满足mocca的需求
        {
            d=d-x;//减去mocca选走的数目
            if(d>=y)//判断剩下的是否满足latte的需求
            {
                e=e-x-y;//减去前面两次选走的数目
                if(e>=z)//判断最后剩下的是否满足Macchiato的需求
                {
                    printf("YES\n");
                }
                else printf("NO\n");
            }
            else printf("NO\n");
        }
        else
        {
            printf("NO\n");
        }
    }
}

问题 D: 讨厌的数字

题目链接:

http://acm.zzuli.edu.cn/problem.php?id=2556

题面:

在这里插入图片描述

题意:

第一行为整数T,代表有T组测试数据。 每组测试数据第一行两个整数N,K。第二行为K个整数A[i],代表讨厌的数字。数据范围:0 < T <= 100, 0 <= N <= 100000, 0 <= K <= 10, 0 <= A[i] <= 9。每组测试数据,输出最小值M,如果M不存在输出"-1"。

思路:

这道题目只要需要判断的情况就两种,一种是存在的情况,一种是不存在的情况,不存在的情况有为是当k为10时,然后之后输入的10个数字分别为0,1,2,3,4,5,6,7,8,9,时的时候是一定不存在一个数大于n并且没有讨厌的数字的情况,另外就是一定存在一个数字M大于n。
注:1.bool 函数:这个函数是定义在C++中的(部分编译器C语言中也有,具体看编译器支不支持),我们想使用这个函数的时候需要使用C++的头文件来使用,这个函数的特殊性是因为这个函数只能返回错误或者正确,当返回错误时就相当与返回0,而返回正确的时候就是返回非0的数字。

参考代码:

#include<bits/stdc++.h>//C++中的几乎万能头文件,能力很强大
using namespace std;
#define maxn 100005
int a[maxn],k,n;
int vis[maxn];//在头文件之下的就是定义的变量属于全局变量,全局变量是可以被本程序所有对象或函数引用
bool s_ans(int x)//bool 类型的函数是在C++中的,这个函数只返回ture or flase ,如果正确就是返回非0的数字,如果错误就是返回0.所以下面的0可以换成flase,1可以换成ture也没有问题。
{
    int ans;
    while(x)
    {
        ans=x%10;//得到x这个数字的每一位
        x/=10;//不断自除使得while循环可以停止,这就是一个简单的求一个数字的各位的套路
        for(int i=0; i<k; i++)
        {
            if(ans==a[i])//判断这位数字是否存在与讨厌数相等的位数
                return 0;//如果存在就返回0,就相当与返回错误
        }
    }
    return 1;//如果没有出现一次讨厌数就返回1,相当于返回正确
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)//t组输入
    {
        memset(vis,0,sizeof(vis));//对vis这个数组进行清0
        int x,a_s=0;
        scanf("%d %d",&n,&k);
        for(int i=0; i<k; i++)
        {
            scanf("%d",&a[i]);
            if(vis[a[i]]==0)
            {
                vis[a[i]]=1;//标记0到k-1中的数字哪些输入过
                a_s++;//计算总共标记了几个不相同的讨厌数
            }
        }
        if(a_s==10||n!=0&&a_s==9&&vis[0]==0)//当不相同的讨厌数为10时,就是为0,1,2,3,4,5,6,7,8,9,这时候不可能存在一个M满足大于n,因为每个数字都是讨厌数了.还有一种特殊情况就是当你1到9都讨厌的时候并且n不为0,你也一定不会存在应该数字不包含讨厌数大于n的情况,所以要进行特判。
        {
            printf("-1\n");//这时候就输出-1
            continue;
        }
        for(int i=n;; i++)
        {
            if(s_ans(i))//利用函数来判断是否满足不包含讨厌数
            {
                printf("%d\n",i);//如果不包含就输出
                break;//一旦出现就是最小的一个数大于n,这时候就可以跳出for循环
            }
        }

    }
    return 0;
}

问题 E: 拼字母

题目链接:

http://acm.zzuli.edu.cn/problem.php?id=2557

题面:

在这里插入图片描述

题意:

第一行为整数T,代表有T组测试数据。 每组测试数据为26个整数a[i],分别代表字母的数量。a[0]代表字母"a"的数量,a[1]代表字母"b"的数量,以此类推。数据范围:0 < T <= 100, 0 <= a[i] <= 1e9。然后输入最多可以组成多少个hello, world。输出组成的组数。

思路:

这道题目基本思路就是判断hello, world中的各个字母的数目,来判断他能不能组成一个hello, world,最后选择出现次数的为基准为确定可以组成的hello, world的组数。

参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    int t;
    long long int a[100000];
    scanf("%d",&t);
    while(t--)
    {
        long long i,k;
        long long b[100000];
        for(i=1;i<=26;i++)
        {
            scanf("%lld",&a[i]);
        }
        k=0;
        b[0]=a[4];//存储字母d的数目
        b[1]=a[5];//存储字母e的数目
        b[2]=a[8];//存储字母h的数目
        b[3]=a[12];//存储字母l的数目
        b[4]=a[15];//存储字母o的数目
        b[5]=a[18];//存储字母r的数目
        b[6]=a[23];//存储字母w的数目
        b[3]=b[3]/3;//组成一个hello, world需要3个字母l
        b[4]=b[4]/2;//组成一个hello, world需要两个o
        sort(b,b+7);//对其组成可以组成hello, world的字母数目进行从小到大排序
        printf("%d",b[0]);//输出最小值就是可以组成最多的组数
        if(t!=0) printf("\n");
    }
}

问题 G: 数字的乘积

题目链接:

http://acm.zzuli.edu.cn/problem.php?id=2559

题面:

在这里插入图片描述

题意:

第一行为整数T,代表有T组测试数据。每组测试数据两个整数N和M。数据范围: 0 < T <= 100, 0 <= N, M <= 1e18。每组测试数据,输出N和M的乘积(结果对 1e18+7 取余.

思路:

这道题目根据N,M的范围确定肯定不能暴力解决,这时我们就需要(a+b)%mod==(a%mod+b%mod)%mod来使得数字不会爆掉long long 形,我们通过类似快速幂的方法。
注:这里引入一个快速幂的方法https://blog.csdn.net/yangzijiangac/article/details/96430488?utm_source=app
具体解释可以参考这个博客

参考代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
const long long mod=1000000000000000000+7;
long long quick_add(long long  a,long long  b,long long  mod)//定义一个快速加的函数
{
    long long  ans=0;
    while(b)//
    {
        if(b%2==1)//当b为奇数时,则需要单独加那个数字
        ans=(ans+a)%mod;
        a=(a+a)%mod;//b为偶数时则直接加。
        b=b/2;//加的次数减半
    }//最后这样b都会为1,所以最后的数值一定会存储在ans中
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long a,b;
        scanf("%lld %lld",&a,&b);
        long long ans=quick_add(a,b,mod);
        printf("%lld\n",ans);

    }
}

问题 H: 阶乘的位数

题目链接:

http://acm.zzuli.edu.cn/problem.php?id=2560

题面:

在这里插入图片描述

题意:

输入一个t,代表t组输入,然后每组输入一个N和B,算出N的阶乘,在B进制下的位数。

思路:

这道题目显然不能有简单的阶乘去处理,因为到30的阶乘的时候long long 就会爆掉,我们不需要计算他在n的阶乘时的确定数值,只需要知道位数,我们就可以使用log ,在十进制的时候我们可以使用log10来计算这个数字的位数,而如果要计算他在b进制下的位数,则就可以使用logk()来计算而n的阶乘的位数就可以表示为logk(1)+logk(2)…这样子,就不会使得数据爆掉。这时候就可以顺利的计算n的阶乘在b进制下的位数。

参考代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
       int n,k,sum;
       double ans=0;
       scanf("%d %d",&n,&k);
       for(int i=1;i<=n;i++)
       {
           ans+=log(i)/log(k);
       }
        ans+=1;//因为是对b取log,我们需要+1.我们可以想8对10取log的结果是小于1的,而8这个数字是一位,所以需要加一个1再强制转换为整型
        sum=ans;//将小数强制转换为整数
        printf("%d\n",sum);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kunyuwan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值