Hzu挑战自我


私信TA

用户名:gxhzxyjsj

访问量:98762

签 名:

2024终究会过去,期待2025!

等  级
排  名 8
经  验 27853
参赛次数 67
文章发表 157
年  龄 0
在职情况 教师
学  校 贺州学院
专  业 软件工程

  自我简介:

弱鸡一个,继续努力!

解题思路:    

    方法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分

10 人评分

  评论区

大佬,方法二if( (int)(x*Q/100)-(int)(x*P/100)==1 )中是如何判断出是等于1就是满足条件的?
2019-07-21 23:35:08
  • «
  • 1
  • »