本文主要是介绍郑州轻工业大学第三次周赛题目总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目总链接:
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这个数组进行清0int 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");//这时候就输出-1continue;}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个字母lb[4]=b[4]/2;//组成一个hello, world需要两个osort(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);}
}
这篇关于郑州轻工业大学第三次周赛题目总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!