zzuli2506: 建勋的魔法学院

耗尽温柔 提交于 2020-01-29 04:41:00

2019年建国的魔法学院招了一批学生,下面仅仅给出了24个学生的名单:
XIAO KEAI
XIAO TAOQI
XIAO TIAOPI
XIAO CONGMING
XIAO TIANCAI
XIAO LINJIE
XIAO KAIXIN
XIAO CHAOYUE
XIAO ZHONGYAO
XIAO TIANXIN
XIAO NAOHU
XIAO BOJUE
XIAO FEILONG
XIAO BEIBEI
XIAO LINGLONG
XIAO ZUZONG
XIAO TIANTIAN
XIAO BAOZI
XIAO TUANTUAN
XIAO YUANYUAN
XIAO QINGYU
XIAO YUER
XIAO DONGDONG
XIAO MING
好像都姓小啊!!!
踏进校门的瞬间学生们看见学院中有一条长长的阶梯,大家想知道这条长长的阶梯有多少阶。由于一眼望不到头,所以大家只能走上阶梯数一数了,由于阶梯太长,全部走完太累了,所以走到自己可以看见阶梯的最上方时就会停下数一数还有多少阶没有走,也是因为太长了,大家都没有记得自己走了多少阶,由于每个人的魔法能力不一定相同,所以每个人每步跨的阶梯数也是不同的。
本次游戏共有n个学生参与,第i个学生每步跨的阶梯数是ai,第i个学生最后停下时未走的阶梯数还有bi。
即a1,a2,…,an是第一个学生到第n个学生每步跨的阶梯数,b1,b2,…,bn是第一个学生到第n个学生停下时未走过的阶梯数。
输入数据保证所有学生的魔法能力都会大于0,且所有学生都还未走完阶梯。
魔法学院的建勋校长找你帮他求出这长长的阶梯的最少会有多少阶数?
设最少会有W个阶梯,题目数据保证答案0 < W <= 100000。

输入
第一行一个整数n。(1 <= n <= 100)
第二行n个整数,表示ai。(0 < ai <= W)
第三行n个整数,表示bi。(0 < bi <= W)

输出
输出一个整数表示阶梯的最少会有多少阶数。

样例输入 Copy
2
2 3
1 1

样例输出 Copy
1

提示
题目样例中W = 1,2名学生分别走了0,0步。

#include<stdio.h>
int main()
{
	int i,n,max,temp,a[1000],b[1000];
	 	scanf("%d", &n);
	 	for(i=1;i<=n;i++)
	 	{
	 		scanf("%d", &a[i]);
		 }
		 for(i=1;i<=n;i++)
		 {
		 	scanf("%d", &b[i]);
		 }
		 temp=0;
		 for(i=1;i<=n;i++)
		 {
		 	if(b[i]>temp)
		 	{
		 		temp=b[i];
		 		max=i;
			 }
		 }
		 while(1)
		 {
		 
		 for(i=1;i<=n;i++)
		 {
		 	if((b[max]-b[i])%a[i]!=0)
		 	{
		 		b[max]+=a[max];
		 		break;
			 }
		 }
		 if(i==n+1)
		 break;
	}
	printf("%d", b[max]);
	return 0;
}

这些停下来之后还剩的台阶里寻求最大值,最大值即为台阶的最少数,以这个最大值为基础,此处先命名为最小台阶数(同时要找到他所对应的每一步上的台阶数),使用暴力循环,对每一个同学的情况进行判断,如果每个同学的每步台阶数呈上一个整数再加上未走的台阶数等于最小台阶数,则此最小台阶数符合情况,如此进行一个一个判断,如果出现哪一位同学的情况不满足,则让最小台阶数再加上他所对应的一步台阶数,再进行判断,如若出现不满足的情况,则再加一次(注意!:每次改变完最小台阶数后,要从第一个同学开始重新判断),直到最后找出最小台阶数。
原理:先拉出来一位同学的情况,求出满足他的最小台阶数,再用满足他的最小台阶数对每个同学进行判断,如果不成立,则让最先的同学再走一步,(注意此方法前提是先让一个同学的情况满足),如果不行,再走一步,直到这位同学的最小台阶数满足所有同学,即可。
这里,随便拉一个可能会造成时间超限,因为如果这个同学的每步台阶数很小的话,那么他达到正确答案会循环很多次,造成时间超限,所以最好的办法就是找每步最大的(每次加的台阶数大可以减少循环)或找未走完的最大的(这样从初始就最接近正确答案,减少时间)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!