L2-037 包装机、L2-038 病毒溯源、L2-039 清点代码库

151 阅读1分钟
  • L2-037 包装机
  • L2-038 病毒溯源
  • L2-039 清点代码库

1、包装机

#include<bits/stdc++.h>
using namespace std;
stack<char>stk;
queue<char>q[101];
int main(){
    int n,m,s;
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            char ch;
            cin>>ch;
            q[i].push(ch);
        }
    }
    int t;
    while(cin>>t, t!=-1){
        if(t){
            if(!q[t].size())
                continue;
            if(stk.size() == s){
                cout<<stk.top();
                stk.pop();
            }
            stk.push(q[t].front());
            q[t].pop();
        }else{
            if(stk.size()){
                cout<<stk.top();
                stk.pop();
            }
        }
    }
    return 0;
}

2、病毒溯源

dfs

#include "bits/stdc++.h"

using namespace std;
int n;
vector<int> v[10010];
int f[10010], root = 0;
vector<int> ans, p;

void dfs(int node) {
    if (v[node].empty()) {
        if (ans.size() < p.size()) ans = p;
        if (ans.size() == p.size() && ans > p)ans = p;
        return;
    }
    for (int i: v[node]) {
        p.push_back(i);
        dfs(i);
        p.pop_back();
    }
}

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        root += i;
        f[i] = -1;
    }
    int t, k;
    for (int i = 0; i < n; ++i) {
        cin >> k;
        while (k--) {
            cin >> t;
            v[i].push_back(t);
            f[t] = i;
            root -= t;
        }
    }
    p.push_back(root);
    dfs(root);
    cout << ans.size() << endl
         << ans[0];
    for (int i = 1; i < ans.size(); ++i) {
        cout << ' ' << ans[i];
    }
}

bfs

#include<bits/stdc++.h>
using namespace std;
vector<int>v[10001];
queue<pair<int,int>>q;
vector<int>ma;
int main(){
    int n;
    cin>>n;
    int f[n] = {0},die[n];
    for(int i=0;i<n;i++){
        int k;
        cin>>k;
        while(k--){
            int c;
            cin>>c;
            v[i].push_back(c);
            f[c] = 1;
            die[c] = i;
        }
        sort(v[i].begin(),v[i].end());
    }
    int root;
    for(int i=0;i<n;i++){
        if(f[i] == 0)
            root = i;
    }
    q.push({root,1});
    int max = 0,zz = root;
    while(q.size()){
        int k = q.front().first,l = q.front().second;
        q.pop();
        if(l>max){
            max = l;
            zz = k;
        }
        for(int i=0;i<v[k].size();i++){
            q.push({v[k][i],l+1});
        }
    }
    ma.push_back(zz);
    while(zz != root){
        zz = die[zz];
        ma.push_back(zz);
    }
    cout<<ma.size()<<endl<<ma[ma.size()-1];
    for(int i=ma.size()-2;i>-1;i--)
        cout<<' '<<ma[i];
    return 0;
}

3、清点代码库

#include<bits/stdc++.h>

using namespace std;
map<vector<int>, int> mp;
struct ff {
    vector<int> a;
    int b;
} f[10005];

bool cmp(ff a, ff b) {
    if (a.b == b.b)
        return a.a < b.a;
    else
        return a.b > b.b;
}

int main() {
    int n, m;
    cin >> n >> m;
    while (n--) {
        vector<int> v;
        for (int i = 0; i < m; i++) {
            int num;
            cin >> num;
            v.push_back(num);
        }
        mp[v]++;
    }
    cout << mp.size() << endl;
    auto it = mp.begin();
    for (int i = 0; it != mp.end(); i++, it++) {
        f[i].a = it->first;
        f[i].b = it->second;
    }
    sort(f, f + mp.size(), cmp);
    for (int i = 0; i < mp.size(); i++) {
        cout << f[i].b;
        for (int j = 0; j < m; j++)
            cout << ' ' << f[i].a[j];
        cout << endl;
    }
    return 0;
}