關於輸入一組資料求最小的問題

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   資料   

問題連結:

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.