10474 - Where is the Marble?(****好题)

来源:互联网 发布:ubuntu中文设置 编辑:程序博客网 时间:2024/05/12 08:48

正常的思路,做出来结果超时。

//Time limit exceeded#include <iostream>#include <limits.h>#include <cstdio>using namespace std;#define MAXN 10000int 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);elseprintf("%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]);elseprintf("%d not found\n",t);}}return 0;}