【题目讲解02】2023 年中山市第十一届义务教育段信息学邀请赛初级组线上赛

打折扣问题(price)

题目描述

Jimmy 需要采购一些笔,某商场正在搞优惠活动:每支笔 M 元,若购买数量超过 10 支,则打 9 折,超过 50 支,打 8 折,超过 100 支,打 7 折,Jimmy 需要采购 N 支笔,请你计算 Jimmy 应付多少元钱? 

输入

一行两个正整数,N 和 M(N,M<=1000)。

输出

一行一个实数 s,请保留两位小数。 

样例输入

11 10

样例输出

99.00

题解

只需要使用三个判断语句即可

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
	scanf("%d%d",&n,&m);
	if(n<=10)
	{
		double s=n*m;
		printf("%.2lf",s);
		return 0;
	}
	if(n>10&&n<=50)
	{
		double s=m*0.9*n;
		printf("%.2lf",s);
		return 0;
	}
	if(n>50&&n<=100)
	{
		double s=m*0.8*n;
		printf("%.2lf",s);
		return 0;
	}
	if(n>100)
	{
		double s=m*0.7*n;
		printf("%.2lf",s);
		return 0;
	}
} 

三角形问题(triangle) 

 

题目描述

Jimmy 规定一个三角形的三条边的长度均为正整数,希望聪明的你帮忙求三边之和不超过 n 的直角三角形个数。
提示:a、b、c 是直角三角形三条边的长度,a、b 是两条直角边长度,c 是斜边长度,它们满足 a²+b²=c²。

输入

一行,一个正整数 n。

输出

一行,一个正整数 s。 

样例输入

15

样例输出

1

数据范围限制

对于 30%的数据: 1<=n<=100
对于 70%的数据: 1<=n<=1000
对于 100%的数据: 1<=n<=10000 

提示

三条边分别为 3、4、5 时可以构成一个直角三角形,三边之和为 12,没有超过
15。

题解

仅需枚举其中两条边即可,再使用勾股定理决定第三条边。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n;
int tmp,tmp2;
long long ans;//注意数据范围,要开long long
double tmp1;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n/2;i++)
	{
		for(int j=i;j<=n/2;j++)
		{
			tmp=i*i+j*j;
			tmp2=sqrt(tmp);
			tmp1=sqrt(tmp);//判断是否为整数
			if(tmp1==tmp2)
			{
				if(i+j+tmp1<=n)
				{
					ans++;
				} 
			} 
		}
	} 
	printf("%lld",ans);
}

公约数问题(divisor)

题目描述

近来 Jimmy 在研究一种公约数。比如两个数 21 和 14,除 1 外,第二小的能被 21 整除又能被 14 整除的数就是 7 啦,Jimmy 把 7 称为 21 与 14 的次小公约数。 

输入

第一行一个整数 n,表示要研究的整数的个数。
第二行是 n 个整数 ai,每个整数之间有一个空格。 

输出

只有一个整数,表示找到的次小公约数(除 1 外),数据保证有解。

样例输入

2
21 14

样例输出

7

数据范围限制

对于 30%的数据:n=2(表明只有 2 个数),ai<=10000
对于 50%的数据:2<=n<=1000,ai<=10000
对于 100%的数据:2<=n<=1000,10^8<=ai<=10^10(^表示多少次方)

题解

自编寻找两个数的最大公因数的函数(GCD),输入时挨个寻找所有数的最大公因数,再用最大公因数枚举,直接枚举会超时!!!

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,maxx,gcdd,mar;
long long a[1005];
long long gcd(long long x,long long y)//寻找最大公因数函数
{
	if(y==0)
	{
		return x;
	} 
	return gcd(y,x%y);
} 
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		if(i==1) gcdd=a[i];
		gcdd=gcd(gcdd,a[i]);//找最大公因数
	}
	for(long long i=2;i<=gcdd;i++)
	{
		mar=0;
		for(long long j=1;j<=n;j++)
		{
			if(a[j]%i!=0)
			{
				mar=1;
				break; 
			}
		}
		if(mar==0)
		{
			printf("%lld",i);
			return 0;
		}
	} 
}

吃水果问题(fruit)

题目描述

我们给 Jimmy 制定了一长串吃水果清单。但是 Jimmy 非常淘气,如果相邻两天吃的水果一样的话,他将会变得非常暴躁,精通编程的你能否帮助判断:是否可以将原有的方案修改成让 Jimmy 不暴躁的方案。 

输入

第一行,一个整数 case,表示测试组数;
对于每组测试数据:
第一行,一个整数 n,表示吃水果天数。
第二行,共 n 个空格隔开的数字 ai,表示每天吃的水果编号。

输出

输出共 case 行,对于每一组测试数据如果存在方案则输出 Y 否则输出 N。

样例输入

2
6
1 2 4 2 2 4
5
1 1 1 2 1

样例输出

Y
N

数据范围限制

case<=100,1<=ai<=n
对于 40%的数据:1<=n<=8
对于 70%的数据:1<=n<=1000
对于 100%的数据:1<=n<=10000

提示

样例 1 存在新的方案 1 2 4 2 4 2 使得任意相邻两天吃的水果不一样,样例 2 不存
在能够使得任意相邻两天吃的水果不一样的新方案。 

题解

只要最多的水果没超过数量一半即可,但是像总数为9但数量最多为5这样也行,因为可以在5个里插入

代码如下:

#include<bits/stdc++.h>//吃水果问题(fruit)
using namespace std;
int n,c,a,b[10005],cnt,maxx,zb1;
int zb;
int main()
{
	scanf("%d",&c);
	for(int i=1;i<=c;i++)
	{
		memset(b,0,sizeof b);
		maxx=0;
		zb=0;
		scanf("%d",&n);
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&a);
			b[a]++;
			maxx=max(b[a],maxx);
		}
		if(n%2==0)
		{
			zb=n/2;
		}
		if(n%2!=0)
		{
			zb=n/2+1;
		} 
		if(maxx<=zb)
		{
			printf("Y\n");
		}
		else
		{
			printf("N\n");
		}
	}
}

望大家关注、点赞支持一下,欢迎提出问题!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值