標籤: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