包装机
用STL模拟就可以了
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int N = 1e2 + 10;
queue<char> q[N];
stack<char> bag;
vector<char> ans;
int n, m, k;
void solve()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
{
string s;
cin >> s;
for (int j = 0; j < m; j++) q[i].push(s[j]);
}
int num;
while (cin >> num)
{
if (num == 0)
{
if (bag.size())
{
ans.push_back(bag.top());
bag.pop();
}
}
else if (num == -1) break;
else
{
if (q[num].size())
{
if (bag.size() == k)
{
ans.push_back(bag.top());
bag.pop();
}
auto t = q[num].front();
q[num].pop();
bag.push(t);
}
}
}
bool p = 0;
for (auto x : ans)
{
cout << x;
}
puts("");
}
int main()
{
solve();
}
病毒溯源
dfs遍历入度为0的根节点,遍历时带着答案状态存,长度一样是需要最小字典序,因此建边时保证从小到大的顺序。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
const int N = 1e4 + 10;
int n, e[N], ne[N], in[N], h[N], idx, ar[N], root;
vector<int> ans;
int cmp(int a, int b)
{
return a > b;
}
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int ro, vector<int> &a)
{
//cout << ro << "to" << endl;
if (a.size() > ans.size())
{
ans.clear();
ans = a;
}
for (int i = h[ro]; ~i; i = ne[i])
{
int j = e[i];
//cout << j <<" "<<in[j]<< endl;
a.push_back(j);
dfs(j, a);
a.pop_back();
}
return;
}
void solve()
{
memset(h, -1, sizeof h);
cin >> n;
for (int i = 1; i <= n; i++)
{
int len;
cin >> len;
for (int j = 1; j <= len; j++)
{
cin >> ar[j];
}
sort(ar + 1, ar + 1 + len, cmp);
for (int j = 1; j <= len; j++)
{
add(i - 1, ar[j]);
in[ar[j]]++;
}
}
for (int i = 0; i < n; i++)
{
if (in[i] == 0)
{
root = i; break;
}
}
vector<int> st;
st.push_back(root);
dfs(root, st);
int p = 0;
cout << ans.size() << endl;
for (auto x : ans)
{
if (p) cout << " ";
cout << x;
p = 1;
}
puts("");
}
int main()
{
solve();
}
清点代码库
这题考虑用vecter排序,map去重,注意STl的使用。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int N = 1e4 + 10;
int n, m;
typedef pair<int, vector<int>> PI;
vector<int> a[N];
PI b[N];
map<vector<int>, int> mp;
static int cmp(PI a, PI b)
{
if (a.first != b.first)
{
int aa = a.first, bb = b.first;
return aa > bb;
}
else
{
return a.second < b.second;
}
}
void solve()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
int num;
cin >> num;
a[i].push_back(num);
}
mp[a[i]]++;
}
int cntt = 1;
for (auto x : mp)
{
b[cntt].first = x.second;
b[cntt++].second = x.first;
}
sort(b + 1, b + 1 + mp.size(), cmp);
int cnt = 0;
auto last = a[0];
cout << mp.size() << endl;
for (int i = 1; i <= mp.size(); i++)
{
if(b[i].second != last)
{
cout << b[i].first << " ";
int p = 0;
for (auto x : b[i].second)
{
if (p) cout << " ";
cout << x;
p = 1;
}
puts("");
last = b[i].second;
}
}
}
int main()
{
solve();
}
还原文件
暴力dfs,每个小纸片依次和缺口位置对比,感觉比有的二阶题容易。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int N = 1e5 + 10;
int n, m;
vector<int> ans, res[110];
int a[N], vis[110], pos;
void dfs(int id, vector<int>& card)
{
if (id == n)
{
int p = 0;
for (auto x : card)
{
if (p) cout << " ";
cout << x;
p = 1;
}
cout << endl;
return;
}
for (int i = 1; i <= m; i++)
{
if (vis[i] == 0)
{
bool check = 1;
for (int j = 0, l = id; j < res[i].size(); j++, l++)
{
if (res[i][j] != a[l])
{
check = 0;
break;
}
}
if (check)
{
card.push_back(i);
vis[i] = 1;
dfs(id + res[i].size() - 1, card);
vis[i] = 0;
card.pop_back();
}
}
}
}
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
cin >> m;
for (int i = 1; i <= m; i++)
{
int k;
cin >> k;
for (int j = 1; j <= k; j++)
{
int num;
cin >> num;
res[i].push_back(num);
}
}
vector<int> p;
pos = 1;
dfs(1, p);
}
int main()
{
solve();
}