标签:
原本觉得挺简单的,开始就一直RE,后来还T。。发现是服务器可能出问题了,老化了,时间变慢了,拿以前A掉的代码来都是T。
不过还是有快的方法的。
就是位运算。另外stl里也有现成的函数可以用nth_element(s,s+k-1,s+n);
但是还有一个问题,nth_element()换成自己写的就T。。无语了。。
大家快来指点一下啊~~~~
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<functional> #include<algorithm> #include<cmath> #include<stack> #include<deque> #include<queue> #include<ctime> #include<map> #define read freopen("q.in","r",stdin) #define write freopen("q.out","w",stdout) using namespace std; int x[2000006],f[2000]; char s[22000006]; int n,k; int main() { // read; memset(f,0,sizeof(f)); for(int i='0';i<='9';i++)f[i]=1; while(~scanf("%d%d",&n,&k)) { getchar(); int i,j=0,cnt=0; memset(x,0,sizeof(x)); gets(s); int len=strlen(s); int cur=0; for(i=cur=0;i<len;) { int v=0; for(;f[s[i]]==0;i++); v=s[i]-48; for(;f[s[++i]]==1;v=(v<<3)+(v<<1)+s[i]-48);//这里就是乘以10 的运算,如果直接写*10就会T,位运算大法好啊~ x[cur++]=v; // cout<<v<<endl; } nth_element(x,x+k-1,x+n); printf("%d\n",x[k-1]); } }
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<functional> #include<algorithm> #include<cmath> #include<stack> #include<deque> #include<queue> #include<ctime> #include<map> #define read freopen("q.in","r",stdin) #define write freopen("q.out","w",stdout) using namespace std; int x[2000006],f[2000]; char s[22000006]; int n,k; int findKth(int left,int right) { // if(left==right)return left; int i=left,j=right,center,tmp; int p=right; center=x[p]; for(;i<j;) { while(x[i]<=center && i<j)i++; while(x[j]>=center && i<j)j--; if(i<j) { tmp=x[i]; x[i]=x[j]; x[j]=tmp; } } x[p]=x[j]; x[j]=center; return j; } int find(int l,int r) { int i=findKth(l,r); if(k==i)return x[i]; else if(k>i)return find(i+1,r); else return find(l,i-1); } int main() { //read; memset(f,0,sizeof(f)); for(int i='0';i<='9';i++)f[i]=1; while(~scanf("%d%d",&n,&k)) { getchar(); int i,j=0,cnt=0; memset(x,0,sizeof(x)); gets(s); int len=strlen(s); int cur=1; for(i=0;i<len;) { int v=0; for(;f[s[i]]==0;i++); v=s[i]-48; for(;f[s[++i]]==1;v=(v<<3)+(v<<1)+s[i]-48); x[cur++]=v; //cout<<v<<endl; } // nth_element(x,x+k-1,x+n); printf("%d\n",find(1,n)); } }
标签:
原文地址:http://blog.csdn.net/u010582475/article/details/44907749