L2-1 包装机 (25 分)
题意:就是有有3个队列,输入哪个序号对应的队列就落下一个数进入栈里,如果栈满了就把栈先提取出来一个再落下,拿出来的序号是多少?
题解:当时脑子乱了,如果栈满应该先拿出来再落下的,理解错了,就一直输出MAAT了,其实就是遍历,按要求使用stack就可以了。
代码:
#include<bits/stdc++.h>
#include<stack>
#include<vector>
using namespace std;
const int maxn=1e3+7;
int n,m,q,smax;
int w,e;
stack<int>s1[maxn];
stack<int>s2,s3;
vector<int>v;
int main(){
cin>>n>>m>>smax;
for(int i=1;i<=n;i++){
string p;
cin>>p;
for(int j=p.size()-1;j>=0;j--){
s1[i].push(p[j]);
}
}
cin>>q;
while(q!=-1){
if(q==0){
if(s2.empty()!=1){
e=s2.top();
s3.push(e);
s2.pop();
}
}
else{
if(s1[q].empty()!=1){
w=s1[q].top();
s2.push(w);
s1[q].pop();
}
if(s2.size()>smax){
s2.pop();
s3.push(s2.top());
s2.pop();
s2.push(w);
}
}
cin>>q;
}
while(s3.empty()!=1){
v.push_back(s3.top());
s3.pop();
}
for(int i=v.size()-1;i>=0;i--){
cout<<char(v[i]);
}
cout<<endl;
}
L2-2 病毒溯源 (25 分)
题意:病毒会一直变异,问变异出的最长序列是多少,变异了哪些个体?
题解:跟虎口脱险那题很像,用标记数组找出第一个变异病毒的序号,然后用dfs搜索最长序列就好,不过应该对每一个病毒都进行一次dfs然后就可以排序把变异长度最多的放到第一个,然后再开一次dfs遍历即可,就可以得到最长的序列了。
代码:
#include <bits/stdc++.h> using namespace std; const int N = 10007; int n, m, dis[N],f[N],p; int maxn=-1; int a[N]; int g=0; vector<int> v[N]; bool cmp(int a, int b) { if(dis[a] == dis[b]) return a < b; return dis[a] > dis[b]; } int dfs(int x) { if(dis[x]) return dis[x]; if(!v[x].size()) return dis[x] = 1; int ret = 0; for(int i = 0;i < v[x].size(); ++ i) { ret = max(ret, dfs(v[x][i]) + 1); } return ret; } void cz(int p){ a[g]=p; g++; if(v[p].size()!=0){ cz(v[p][0]); } } int main() { scanf("%d", &n); for(int i = 0;i < n; ++ i) { scanf("%d", &m); for(int j = 0;j < m; ++ j) { int x; scanf("%d", &x); f[x]=1; v[i].push_back(x); } } for(int i = 0;i < n; ++ i) { if(f[i]==0){ p=f[i]; } dis[i] = dfs(i); maxn = max(maxn, dis[i]); } cout<<maxn<<endl; for(int i = 0;i < n; ++ i) { sort(v[i].begin(), v[i].end(), cmp); } for(int i = 0;i < n; ++ i) { if(maxn == dis[i]) { cz(i); break; } } for(int i=0;i<g;i++){ if(i==0){ cout<<a[i]; } else{ cout<<" "<<a[i]; } } cout<<endl; }
L2-3 清点代码库 (25 分)
题意:题意很简单,就是对一定数组的数进行去重,判断有多少个。
题解:没拿到满分,超时了,想法是把这些数组中的数转成string型,然后用p一直加起来,最后采用map<string,int>求出个数,不过超时了。。
代码:
#include<bits/stdc++.h> #include<map> using namespace std; const int maxn=1e4+7; struct xx{ int x; string r; } a[maxn]; bool cmp(xx p,xx q){ return p.x>q.x; } int g; int main() { map<string,int>mp; map<string,int>::iterator it; int n,m; string p; cin>>n>>m; for(int i=0; i<n; i++) { int a[m+10]= {0}; for(int j=0; j<m; j++) { cin>>a[j]; } p.clear(); for(int j=0; j<m; j++) { stringstream w; string e; w<<a[j]; w>>e; if(j==0){ p+=e; } else{ p+=" "; p+=e; } } mp[p]++; } cout<<mp.size()<<endl; for(it=mp.begin();it!=mp.end();it++){ a[g].r=(*it).first; a[g].x=(*it).second; g++; } sort(a,a+g,cmp); for(int i=0;i<g;i++){ cout<<a[i].x<<" "<<a[i].r<<endl; } }
L2-4 哲哲打游戏 (25 分)
题意:就是根据序号的多少,使用存档,读档,操作,然后输出存档的位置和最终的位置
题解:用vector数组就可以,然后遍历判断就好,比较简单
代码:
#include <iostream> #include <vector> using namespace std; int main() { int n, m; std::ios::sync_with_stdio(false); cin >> n >> m; vector<int> a[n+1]; for(int i = 1; i <= n; i++) { int k; cin >> k; a[i].push_back(-1); for(int j = 0; j < k; j++) { int t; cin >> t; a[i].push_back(t); } } int t = 1; int b[n+1] = {0}; for(int i = 0; i < m; i++) { int x, y; cin >> x >> y; if(x == 0) { t = a[t][y]; } else if(x == 1) { cout << t << endl; b[y] = t; } else if(x == 2) { t = b[y]; } } cout << t; }