人生列车

follow on!success!

导航

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

问题链接:

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

 

posted on 2014-07-29 15:14  tianxia2s  阅读(223)  评论(0编辑  收藏  举报