打折扣问题(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");
}
}
}
望大家关注、点赞支持一下,欢迎提出问题!