私はspojでこの問題を試していました。まず第一に、私はある種の自明な o(blogb) アルゴリズムを思いつきました (whats b については問題を参照してください)。それが合格する場合.とにかく、せん断の信念から、私は次のようにコーディングしました
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<cstdlib>
#include<stack>
#include<queue>
#include<string>
#include<cstring>
#define PR(x) cout<<#x"="<<x<<endl
#define READ2(x,y) scanf("%d %d",&x,&y)
#define REP(i,a) for(long long i=0;i<a;i++)
#define READ(x) scanf("%d",&x)
#define PRARR(x,n) for(long long i=0;i<n;i++)printf(#x"[%d]=\t%d\n",i,x[i])
using namespace std;
#include <stdio.h>
struct node {
int val;
int idx;
};
bool operator<(node a,node b){ return a.val<b.val;}
node contain[10000001];
int main(){
int mx=1,count=1,t,n;
scanf("%d",&t);
while(t--){
count=1;mx=1;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&contain[i].val);
contain[i].idx=i;
}
sort(contain,contain+n);
for(int j=1;j<n;j++){
if(contain[j].idx>contain[j-1].idx)
count++;
else count=1;
mx=max(count,mx);
}
printf("%d\n",n-mx);
}
}
そして、SPOJサーバーで0.01秒で通過しました(遅いことが知られています)しかし、すぐにO(b)アルゴリズムを思いつきました。コードは以下のとおりです
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<cstdlib>
#include<stack>
#include<queue>
#include<string>
#include<cstring>
#define PR(x) printf(#x"=%d\n",x)
#define READ2(x,y) scanf("%d %d",&x,&y)
#define REP(i,a) for(int i=0;i<a;i++)
#define READ(x) scanf("%d",&x)
#define PRARR(x,n) for(int i=0;i<n;i++)printf(#x"[%d]=\t%d\n",i,x[i])
using namespace std;
int val[1001];
int arr[1001];
int main() {
int t;
int n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int mn=2<<29,count=1,mx=1;
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
if(arr[i]<mn) { mn=arr[i];}
}
for(int i=0;i<n;i++){
val[arr[i]-mn]=i;
}
for(int i=1;i<n;i++){
if(val[i]>val[i-1]) count++;
else {
count=1;
}
if(mx<count) mx=count;
}
printf("%d\n",n-mx);
}
}
しかし、驚くべきことに0.14秒かかりました:O
ここで私の質問は、 b > 2 の場合、 o(b) が o(blogb) よりも優れているということではありませんか? では、なぜこれほどまでに時間差があるのでしょうか。コミュニティのメンバーの 1 人は、キャッシュ ミスが原因である可能性があると示唆しました。o(b) コードは、o(blogb) に比べてローカライズされていません。コードの実行?(はい、b は実際には 1000 未満です。なぜ問題設定者がそれほど誇張したのかわかりません)
EDIT :すべての答えは、アルゴリズムの実行時間に格差を引き起こすことが多い漸近表記の隠された定数値に向かっていることがわかります。ループの.今、私はソートが配列の各要素に少なくとも1回アクセスすると仮定しています.実行される行数で考えると、両方のプログラムをさらに近づけませんか?もちろん、spojでの私の過去の経験はI/Oを教えてくれます.プログラムの実行時間に大きな影響を与えますが、両方のコードで同じ I/O ルーチンを使用しています。