PAT考试乙级1030(C语言实现)重点题目

来源:互联网 发布:淘宝必买清单编辑器 编辑:程序博客网 时间:2024/06/05 15:09

以下两段代码均为C++编译器

#include<stdio.h>#include<algorithm>using namespace std;int main(){    int N,i,j,c=0;    double p,a[100001];    scanf("%d %lf",&N,&p);    for(i=0;i<N;i++){        scanf("%lf",&a[i]);    }    sort(a,a+N);//排序的起始地址到结束地址    for(i=0;i<N;i++){//a[i]作为最小值        for(j=N-1;j>0;j--){            if(a[j]<=a[i]*p){//a[j]作为最大值                if(c<j-i) c=j-i;//更新长度                else break;            }        }    }    printf("%d\n",c+1);    return 0;}

这个答案提交后会有一个测试点运行超时,因为会做一些重复的循环,需要将代码进行改进。

#include<stdio.h>#include<algorithm>using namespace std;int main(){    int N,i,j,c=0;    double p,a[100001];    scanf("%d %lf",&N,&p);    for(i=0;i<N;i++){        scanf("%lf",&a[i]);    }    sort(a,a+N);//排序的起始地址到结束地址    for(i=0;i<N;i++){//a[i]作为最小值        for(int j=i+c;j<N;j++){ //j置为要满足可以更新数列长度的值,减少循环次数            if(a[j]>a[i]*p) //如果不满足条件了,则将下一个元素最为最小值                break;            if(j-i>c)         //如果此次的长度大于上一次,更新数列长度                c=j-i;        }    }    printf("%d\n",c+1);//由于数组从0开始    return 0;}

以下是C编译器的代码:

#include<stdio.h>#include<stdlib.h>int cmp(const void *a,const void *b){    return *((double *)a)-*((double *)b);  }int main(){    int N,i,j,c=0;    double p,a[100001];    scanf("%d %lf",&N,&p);    for(i=0;i<N;i++){        scanf("%lf",&a[i]);    }    qsort(a,N,sizeof(double),cmp);//排序的起始地址到结束地址    for(i=0;i<N;i++){//a[i]作为最小值        for(int j=i+c;j<N;j++){ //j置为要满足可以更新数列长度的值,减少循环次数            if(a[j]>a[i]*p) //如果不满足条件了,则将下一个元素最为最小值                break;            if(j-i>c)         //如果此次的长度大于上一次,更新数列长度                c=j-i;        }    }    printf("%d\n",c+1);//由于数组从0开始    return 0;}

本题参考http://blog.csdn.net/wanmeiwushang/article/details/51456488

总结:
1、由于a数组可能会超出int范围所以使用double。
2、由于 c中没有sort函数,c中要是有qsort()函数,需要写一个方法,具体内容参考1015.

阅读全文
0 0