您的位置:首页 > 其它

士兵杀敌 三 --- O( 1 ) 的时间复杂度 .

2016-05-05 18:01 267 查看


一看就是 十分简单的 题 , 然后上去开始无脑程序

超时~~~ 感觉时间复杂度 , 已经很低了 , 但是并没有什么卵用 .

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
#include<limits.h>
using namespace std;
int main()
{
int w,q,a[100000],n,m;
scanf("%d%d",&w,&q);
for(int i=1;i<=w;i++)
scanf("%d",&a[i]);
for(int i=0;i<q;i++)
{
int maxn=INT_MIN,minn=INT_MAX;
scanf("%d%d",&n,&m);
for(int j=n;j<=m;j++)
{
maxn=maxn>a[j]?maxn:a[j];
minn=minn<a[j]?minn:a[j];
}
printf("%d\n",maxn-minn);
}
return 0;
}


两个程序的时间复杂度

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
#include<limits.h>
using namespace std;
int dp_max[100005][17];
int dp_min[100005][17];
void RMQ(int n)
{
for(int j = 1; j < 17; j++)     //   这里 为啥 是 20 呢  ? //F[i, j]表示从第i个数起连续2^j个数中的最大值。(DP的状态) ???
{
for(int i = 1; i <= n; i++)
{
if( i + (1<<j)-1 <= n)
{
dp_max[i][j] = max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j -1]);
dp_min[i][j] = min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]);
}
}
}
}
int main()
{
int n,q,m,k;
scanf("%d%d",&n,&q);            //   士兵的 总人数  .
for(int i = 1; i <= n; i++)
{
scanf("%d",&dp_max[i][0]);      //
dp_min[i][0]=dp_max[i][0];    //    最小和最大 都先默认了
}
RMQ(n);             //   一共 有  n  个 数字
while(q--)
{
scanf("%d%d",&m,&k);
int s=(int)(log(k-m+1)/log(2));
int max_val = max(dp_max[m][s],dp_max[k-(1<<s)+1][s]);
int min_val = min(dp_min[m][s],dp_min[k-(1<<s)+1][s]);
printf("%d\n",max_val - min_val);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: