原题链接:班级人数
解题思路:
方法1:
假设当班级有x人时,一定会有y人及格(y<x)。使y/x的值大于P%,小于Q%,直接暴力,不想那么多。结果也AC了。
方法2:
再好好考虑,减少循环次数,不用双重循环,如何更好地解决。
假设当班级有x人时,一定会有y人及格(y<x),使y/x的值大于P%,小于Q%,
所以,反过来推,x*P%一定小于y,x*Q%大于y。
而y是一个整数,所以要求出最小的x,则必须x*Q%与x*P%之间恰好存在一个整数y,
也就是说可以表示为:(int)x*Q%-(int)x*P%==1。
例如:
样例数据是:P%=13,Q%=14.1
当人数x是15时,15*P%=1.95,15*Q%=2.115,y可以取整数2,满足要求
当人数x是14时,14*P%=1.82,14*Q%=1.974,y无法取整数,不满足要求
所以15是最小的。
参考代码:
//方法1:直接暴力,不想那么多。结果也AC了。
#include <stdio.h>
int main()
{
double P,Q;
int x,y;
while(scanf("%lf%lf",&P,&Q)!=EOF)
{
for(x=1;;x++)
{
for(y=1;y<x;y++)
{
double tgl=(double)y/x*100;
if(tgl>P && tgl<Q) //如果满足要求,则直接跳转到语句L1处执行
goto L1;
else if(tgl>=Q) //如果y/x>=Q%,说明分子太大,或者分母太小,则退出内循环
break;
}
}
L1:printf("%d\n",x);
}
return 0;
}//方法2:x*P%一定小于y,x*Q%大于y。
// 而y是一个整数,所以要求出最小的x,则必须x*Q%与x*P%之间恰好存在一个整数y,
//也就是说可以表示为:(int)x*Q%-(int)x*P%==1。
#include<stdio.h>
int main()
{
double P,Q;
int x;
while(scanf("%lf%lf",&P,&Q)!=EOF)
{
for(x=1;;x++)
if( (int)(x*Q/100)-(int)(x*P/100)==1 )
{
printf("%d\n",x);
break;
}
}
return 0;
}0.0分
8 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复