PAT 1085(patty)

网友投稿 198 2022-09-20


PAT 1085(patty)

1、题目链接 https://patest.cn/contests/pat-a-practise/1085 2、题目分析 (1)题意:给出一串数字,然后给出一个数p,请从这串数字中找出可以存在的数字序列,序列中的最大值max与最小值满足max<=min*p;使得这样的序列包含的数字尽量最大 (2)分析:我们可以使用two pointers的方法来实现着一题。 3、问题 (1)在一次次的排除可以排除完的bug之后,我们会发现,有一个难以接受的问题。“时间限制”,对,我们可以看到如果使用下述的代码其余的测试点都会通过,但是会有一个时间超过的问题。代码如下: #include #include using namespace std; #define size 100002 /* 1.使用two pointer */ int main(){ long long n,p; scanf("%ld %ld",&n,&p); int i ; long long array[size]; for(i = 0;i= i){ if(number > (j - i +1)){//如果说number的值已经大于两者的距离,则不再比较 break; } else{ if(array[j] <= array[i] * p){//如果满足条件 if(number <(j - i + 1)){ number = j - i + 1; } break;//只要满足这个情况,就break掉 } else{ j--; } } } } printf("%d",number); } /*测试点 10 8 2 3 20 4 5 1 6 7 8 9 10 8 2 3 25 4 5 10 6 7 8 9 2 5 6 40 */这里给出了几个测试点,可以供大家测试 (2)我们想想一下,我们这里先是对一串数字进行排序,即使用sort(array,array+n),然后从这个数组中找出满足题意的最长子序列。即如下代码实现的功能: for(i = 0 ; i < n ; i++){ int j = n - 1; while(j >= i){ if(number > (j - i +1)){//如果说number的值已经大于两者的距离,则不再比较 break; } else{ if(array[j] <= array[i] * p){//如果满足条件 if(number <(j - i + 1)){ number = j - i + 1; } break;//只要满足这个情况,就break掉 } else{ j--; } } } } 但是,我们是否注意到,如果对于一个已经选择好的数字array[i],我们已经知道了它的最长子序列为number个。如果我们对array[i+1]中的j再从i开始, 则处理速度太慢。即会超时,所以我们从刚才那个处理array[i]的j值开始就可以。这样就会避免时间超时的问题。正确代码如下: #include #include using namespace std; #define size 100002 /* 1.使用two pointer */ int main(){ long long n,p; scanf("%ld %ld",&n,&p); int i ; long long array[size]; for(i = 0;i array[i] * p){ break;//如果是这种情况则跳出循环 } j++; } } printf("%d",number); } /*测试点 10 8 2 3 20 4 5 1 6 7 8 9 10 8 2 3 25 4 5 10 6 7 8 9 2 5 6 40 */


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:pat 1008(patek philippe百达翡丽官网)
下一篇:SpringBoot 使用Mongo的GridFs实现分布式文件存储操作
相关文章

 发表评论

暂时没有评论,来抢沙发吧~