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

问题链接:

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 100010

int 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 100100

using 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

 

你可能感兴趣的:(数据)