9 5 1 2 3 4 5 1 6 1 2
8
下面是ac代码 同学的
bool vis[1000005];上面的定义很牛逼哦vis函数定义 写成 bool 比写成int 要节省很多很多的空间 改成char也能节省很多的空间
#include<stdio.h> #include<string.h> #include<queue> using namespace std; bool vis[1000005]; int n,m; int main() { while(scanf("%d%d",&n,&m)!=EOF) { int i,temp; int x,cnt=0; queue<int>q; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) { scanf("%d",&x); if(cnt<m&&vis[x]==0) //开始的时候少了vis[x]==0的条件,错了4次。。 { cnt++; vis[x]=1; q.push(x); } else { if(vis[x]==0) { temp=q.front(); q.pop(); vis[temp]=0; q.push(x); vis[x]=1; cnt++; } } } printf("%d\n",cnt); } return 0; }
另外 我的有个疑问 为什么加上
que.clear(); sset.clear();我的tle代码就变成了mle 了?
下面是我 的TLE代码
#include<stdio.h> #include<set> #include<vector> using namespace std; multiset<int>sset; multiset<int>::iterator it; vector<int>que; int getval() { int ret(0); char c; while((c=getchar())==' '||c=='\n'||c=='\r'); ret=c-'0'; while((c=getchar())!=' '&&c!='\n'&&c!='\r') ret=ret*10+c-'0'; return ret; } int main() { int i,k,j,n,m,num,sum,ans,h; while(scanf("%d %d",&k,&h)!=EOF) { // que.clear(); // sset.clear(); h--; ans=k; for(i=1;i<=k;i++) { num=getval(); if(sset.find(num)!=sset.end()) ans--; sset.insert(num); que.push_back(num); if(i>h) { num=que[i-h]; it=sset.find(num); sset.erase(it); } } printf("%d\n",ans); } return 0; }