首页 > 代码库 > 关于输入一组数据求最小的问题

关于输入一组数据求最小的问题

问题链接:

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1350

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1408

两个问题,自己第一个代码是没有敲出来的,第二个代码虽然是搞定了,

但是在处理是分析不清楚,使用了两个for循环,导致时间上相对于别人的代码有很大的差距。

自己AC的1408:

#include <iostream>#include <algorithm>using namespace std;int main(){    int t;    cin>>t;    while(t--){        //在这里首先声明我是仅仅考虑了一般的情况,特殊情况待会在统一的考虑    int N,D,count = 1,index = 0;    cin>>N>>D;    int *a = new int [N];//每棵树苗都对应着一个点,将点的坐标保存在这里    for(int i = 0;i < N;i++)cin>>a[i];    sort(a,a+N);    //下面的计算就是要将树苗的坐标记录下来,然后有一个count计数器进行计数    for(int i = 0;i < N;i = index){        int b = a[index] + D;    for(int j = index;j < N;j++){            if(j<N&&a[j]>=b){                count++;                index = j;                break;                }            else index++;    }    }    cout<<count<<endl;    delete [] a;    }    return 0;}
View Code

淦珺在部分细节方面处理的比我好多了,在一for循环中是通过一个变量代表了一个数组,相对来说处理的方式就比我的优化

#include <iostream>#include <cstdio>using namespace std;#define N 100010int d[N];int main(){    int T,n,D,cnt,m;    scanf("%d",&T);    while(T--){        cnt=1;        scanf("%d%d",&n,&D);        scanf("%d",&d[0]);        m=d[0];        for(int i=1;i<n;i++){            scanf("%d",&d[i]);            if(d[i]-m>=D) cnt++,m=d[i];        }        printf("%d\n",cnt);    }    return 0;}
View Code

第1305题AC代码:

#include<iostream>#include<cstdio>#define M 100100using namespace std;int num[M],Max[M],Min[M];//这个Max我不打算要了int max(int a,int b){    return a>b?a:b;}int main(){    int T,n,D;    long long ans;    cin>>T;    while(T--){        ans=0;        cin>>n>>D;        for(int i=0;i<n;i++) cin>>num[i];//原来开始所有的结果都是保存在num这个数组当中        Max[0]=num[0];//第一个        for(int i=1;i<n;i++)        {            if(Max[i-1]-num[i]>D)//当结果是大于的时候,是不符合题目的要求的。//直接让最大值返回,到Max数组,然后后面的数量关系会自动的调整好的                Max[i]=Max[i-1]-D;            else Max[i]=num[i];        }//处理一次最大值,还要处理一次最小值,虽然还没有理解原因。        Min[n-1]=num[n-1];        for(int i=n-2;i>=0;i--)        {            if(Min[i+1]-num[i]>D)                Min[i]=Min[i+1]-D;            else Min[i]=num[i];        }        for(int i=0;i<n;i++)ans+=(max(Min[i],Max[i])-num[i]);//ans+=Min[i]-num[i];//没看懂,取两个的最大值,然后和num[i]作差。//然后不断的将结果返回到ans。什么情况?        cout<<ans<<endl;    }    return 0;}
View Code