通师高专科技创新社训练赛(20221127)

D-Laptop

题目链接

知识点:一维数组、for循环


题意

给你一个整数n(笔记本的数量),接下来n行每行两个Mi,Si(表示内存和速度)。

问被完虐的笔记本数。(完虐即内存和速度都不高于另外某一个笔记本)。

思路

1. 首先笔记本的内存和速度一般是多个,所以可以使用数组进行读入

2. 然后判断是否完虐即Mi<=Mj并且Si<=Sj并且j不等于i的时候,属于完虐

3. 属于完虐则进行计数,最后输出数量

坑点

完虐的定义是都不高于是包括等于的情况的

代码

#include<stdio.h>
int main()
{
	int n;//笔记本的数量 
	int m[100010],s[100010];//m数组表示内存,s数组表示速度,n的范围是10^5,所以开大一点 
	int cnt=0;//用于记录属于完虐的数量 
	scanf("%d",&n);
	for(int i=1;i<=n;i++)//利用for循环读入内存和速度 
	{
		scanf("%d %d",&m[i],&s[i]);
	}
	for(int i=1;i<=n;i++)//利用两层for,遍历判断 
	{
		for(int j=1;j<=n;j++)
		{
			if(m[i]<=m[j]&&s[i]<=s[j]&&j!=i)//属于完虐的情况 
			{
				cnt++;//数量+1 
				break;//停止,为了避免 i 和 j 相同 加重复 
			}
		}
	}
	printf("%d",cnt);//输出数量 
	return 0;
} 

总结

难度简单,细心点问题不大

E- 阶乘计算

题目链接

知识点:阶乘、for循环

题意

输入一个整数n,让你计算S=1!+2!+3!+…+N!的值,输出S

思路

1.首先要知道阶乘是什么(阶乘也就是连乘,1的阶乘是1,二的阶乘是1*2=2,3的阶乘是1*2*3=6)

2.而题目让求的是阶乘的和(也就是每个的阶乘相加)

3.最后输出和

坑点

代码

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	int sum=0;//记录阶乘和 
	int cnt=1;//为了便于后边的阶乘 
	for(int i=1;i<=n;i++)
	{
		cnt*=i;//每个的阶乘 
		sum+=cnt;//阶乘相加 
	}
	printf("%d",sum); //输出总和 
	return 0;
}

总结

难度简单,一定要读清题目

F-最大最小值 

题目链接

知识点:if判断

题意

给你三个整数a,b,c.让你输出其中的最大值和最小值

思路

1.定义一个最大值和最小值的变量,并将其中的一个值赋给最大值和最小值

2.然后用其余的两个跟最大值和最小值进行比较,如果大或者小,则进行最大值和最小值

3.最后输出最大值和最小值

坑点

注意格式,输出最大值后需要换行

代码

#include<stdio.h>
int main()
{
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c); 
	int max=a,min=a;//max表示最大值,min表示最小值,并将a赋给他们 
	if(b>max)//b比最大值大 
	{
		max=b;//更新 max 的值,将 b 赋给 max 
	}
	if(c>max)//c比最大值大 
	{
		max=c;//更新 max ,将 c 赋给 max 
	}
	if(b<min)//b比最小值小 
	{
		min=b;//更新min,将b赋给min 
	}
	if(c<min)//c比最小值小 
	{
		min=c;//更新min,将b赋给min 
	}
	printf("The maximum number is : %d\n",max);
	printf("The minimum number is : %d",min);
	return 0;
} 

总结

难度简单,注意格式

G - [NOIP2005]校门外的树 

题目链接

知识点:for循环

题意

给你一个整数l表示马路长度和一个整数m表示区域的数量,和m个区域的范围(起始点和终止点),区间之间可能有重合的部分,现要将区域的树移走(包括两个端点的树)问马路上剩余的树的树量

思路

1.首先遍历m次,读入区域范围,并进行标记

2.遍历马路的长度,若值未改变则表示未被移走,计数++

3.最后输出数量

坑点

马路的长度是从0开始的,而不是从1开始

代码

#include<stdio.h>
int main()
{
	int l,m;
	int x,y;//区域的起始点x,终止点y 
	int a[10010]={0};//将数组的值都赋值为0 
	scanf("%d %d",&l,&m);
	for(int i=1;i<=m;i++)//m个区域,遍历m次	
    {
		scanf("%d %d",&x,&y);
		for(int j=x;j<=y;j++)//再次利用for 循环遍历区域的范围,并标记为1 表示这些树被移走了 
		{
			a[j]=1;
		}
	}
	int ans=0;//记录剩下的树的数量 
	for(int i=0;i<=l;i++)//遍历马路长度,是从0开始的而不是1 
	{
		if(a[i]==0)//如果该位置值为 0,也就是未被移走 
		{
			ans++;//计数+1 
		}
	}
	printf("%d",ans);//输出未被移走的数量 
	return 0;
}

总结

难度稍难,不容易被想到,要多思考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值