3 solutions
-
6
太简单了
提示:内存数组开大一点
代码
#include <bits/stdc++.h> using namespace std; int a[1005],front,back; int m,n,cnt; void push(int x){ a[back++] = x; } void pop(){ a[front++] = -1; } bool find(int x){ for (int i = front;i < back;i++){ if (a[i] == x) return 1; } return 0; } int main(int argc, char **argv){ memset(a,0xff,sizeof(a)); cin >> m >> n; for (int i = 0;i < n;i++){ int x; cin >> x; if (!find(x)){ push(x); cnt++; if (back - front > m) pop(); } } cout << cnt; return 0; }
-
3
利用一个队列来记录进如内存的先后顺序,利用set来查找内存中是否有当前单词
#include<iostream> #include<string> #include<cmath> #include<set> #include<queue> using namespace std; int n,m,a[10001]; set <int> s; queue <int>q; int main() { int sum=0; cin >> m >> n; //m表示储存空间,n表示文章长度 for (int i=1;i<=n;i++){ int x; cin >> x; if (!s.count(x)){ //如果字典中有直接调用,如果没有将新单词存入 sum++; //记录查词次数 if (s.size()==m){ //如果空间已满 s.erase(q.front()); //弹出队列第一项(最早查询的词)并同步弹出set的这一项 q.pop(); } q.push(x); // 单词加入内存 s.insert(x); //单词加入内存 } } cout << sum; }
-
1
数组模拟队列代码
提示:样例中有0,最好全部重置为-1
#include<bits/stdc++.h> using namespace std; int q[10005],a[1005],cnt,m,n;//题目所需(数组模拟队列) bool isin(int x){//is in:是否在队列里 for(int i=0;i<m;i++){//在前m个数中(即内存)寻找 if(q[i]==x)return true; //若存在返回true } return false;//否则返回false } void push(int x){ int sum=0; for(int i=0;i<m;i++){ if(q[i]!=-1)sum++;//已经被占用的内存量 } if(sum==m){//若内存已满 for(int i=1;i<m;i++){ q[i-1]=q[i];//从第二个到第m个整体前移 } q[m-1]=x;//末位补为x } else{ q[sum]=x;//否则内存量的下一位补为x } } int main(){ memset(q,-1,sizeof(q)); cin>>m>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ if(!isin(a[i])){ push(a[i]); cnt++; } } //push(6); cout<<cnt<<endl; /*for(int i=0;i<m;i++){ cout<<q[i]<<' '; }*/ return /*164*/0; }
- 1
Information
- ID
- 532
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 2
- Tags
- # Submissions
- 101
- Accepted
- 29
- Uploaded By