士兵杀敌 三 --- O( 1 ) 的时间复杂度 .
一看就是 十分简单的 题 , 然后上去开始无脑程序
超时~~~ 感觉时间复杂度 , 已经很低了 , 但是并没有什么卵用 .
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 using namespace std; 16 int main() 17 { 18 int w,q,a[100000],n,m; 19 scanf("%d%d",&w,&q); 20 for(int i=1;i<=w;i++) 21 scanf("%d",&a[i]); 22 for(int i=0;i<q;i++) 23 { 24 int maxn=INT_MIN,minn=INT_MAX; 25 scanf("%d%d",&n,&m); 26 for(int j=n;j<=m;j++) 27 { 28 maxn=maxn>a[j]?maxn:a[j]; 29 minn=minn<a[j]?minn:a[j]; 30 } 31 printf("%d\n",maxn-minn); 32 } 33 return 0; 34 }
两个程序的时间复杂度
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 using namespace std; 16 int dp_max[100005][17]; 17 int dp_min[100005][17]; 18 void RMQ(int n) 19 { 20 for(int j = 1; j < 17; j++) // 这里 为啥 是 20 呢 ? //F[i, j]表示从第i个数起连续2^j个数中的最大值。(DP的状态) ??? 21 { 22 for(int i = 1; i <= n; i++) 23 { 24 if( i + (1<<j)-1 <= n) 25 { 26 dp_max[i][j] = max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j -1]); 27 dp_min[i][j] = min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]); 28 } 29 } 30 } 31 } 32 int main() 33 { 34 int n,q,m,k; 35 scanf("%d%d",&n,&q); // 士兵的 总人数 . 36 for(int i = 1; i <= n; i++) 37 { 38 scanf("%d",&dp_max[i][0]); // 39 dp_min[i][0]=dp_max[i][0]; // 最小和最大 都先默认了 40 } 41 RMQ(n); // 一共 有 n 个 数字 42 while(q--) 43 { 44 scanf("%d%d",&m,&k); 45 int s=(int)(log(k-m+1)/log(2)); 46 int max_val = max(dp_max[m][s],dp_max[k-(1<<s)+1][s]); 47 int min_val = min(dp_min[m][s],dp_min[k-(1<<s)+1][s]); 48 printf("%d\n",max_val - min_val); 49 } 50 return 0; 51 }