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;
}
总结
难度稍难,不容易被想到,要多思考