正常的思路,做出来结果超时。
//Time limit exceeded
#include <iostream>
#include <limits.h>
#include <cstdio>
using namespace std;
#define MAXN 10000
int one[MAXN],two[MAXN],pos_two[MAXN];
int N,Q;
int find(int x)
{
for(int i=0;i<N;i++)
if(one[i]==x)
return i;
return -1;
}
void getRange(int &pos1,int &pos2,int m)
{
int left,right;
left=right=m;
int left_n,right_n;
left_n=right_n=INT_MAX;
for(int i=0;i<m;i++)
{
if(pos_two[i]!=-1 && two[i]>two[m] && (two[i]-two[m])<right_n)
//原来这里出错,原因状态没有搞清楚,这里要找的是右边最近的元素
{
right=i;
right_n=two[i]-two[m];
}
else if(pos_two[i]!=-1 && two[i]<two[m] && (two[m]-two[i])<right_n)
{
left=i;
right_n=two[m]-two[i];
}
}
if(left==m)
pos1=-1;
else
//if(pos_two[left]!=0)
pos1=pos_two[left];//find(left);
if(right==m)
pos2=N;
else
//pos2=find(right);
pos2=pos_two[right];
}
void getPos(int pos1,int pos2,int m)
{
int mid=two[m];
pos1++;
pos2--;
int pos=find(mid);
if(pos==-1)
{
pos_two[m]=-1;
return ;
}
int temp=one[pos1];
one[pos1]=one[pos];
one[pos]=temp;
while(pos1<pos2)
{
while(pos1<pos2 && one[pos2]>=mid) pos2--;
//快速排序条件是>=,不要误认为只有>
if(pos1<pos2) one[pos1]=one[pos2];
while(pos1<pos2 && one[pos1]<=mid) pos1++;
if(pos1<pos2) one[pos2]=one[pos1];
}
one[pos1]=mid;
pos_two[m]=find(mid);
}
int main()
{
/*
freopen("10474.in","r",stdin);
freopen("10474.out","w",stdout);
//*/
int cas=1;
while(scanf("%d %d",&N,&Q)==2)
{
if(N==0 && Q==0)
break;
int i;
for(i=0;i<N;i++)
scanf("%d",&one[i]);
for(i=0;i<Q;i++)
scanf("%d",&two[i]);
printf("CASE# %d:\n",cas++);
for(i=0;i<Q;i++)
{
int pos1,pos2;
getRange(pos1,pos2,i);
getPos(pos1,pos2,i);
if(pos_two[i]!=-1)
printf("%d found at %d\n",two[i],pos_two[i]+1);
else
printf("%d not found\n",two[i]);
}
}
return 0;
}
网上搜了一下,以下是暴力求解,第一次接触什么是暴力求解
主要思路:两次遍历得到他们的次序!
//暴力求解
#include <stdio.h>
#include <string.h>
int main()
{
//freopen("10474.in","r",stdin);
const int maxn=10010;
int N,Q,be[maxn],pos[maxn];
int cas=0;
while(scanf("%d%d",&N,&Q)==2)
{
if(N==0 && Q==0)
break;
cas++;
printf("CASE# %d:\n",cas);
memset(be,0,sizeof(be));
memset(pos,0,sizeof(pos));
int i,t;
for(i=0;i<N;i++)
{
scanf("%d",&t);
be[t]++;
}
int num=0;
for(i=0;i<maxn;i++)
{
if(be[i])
{
pos[i]=num+1;
num+=be[i];
}
}
for(i=0;i<Q;i++)
{
scanf("%d",&t);
if(pos[t])
printf("%d found at %d\n",t,pos[t]);
else
printf("%d not found\n",t);
}
}
return 0;
}