天梯赛pta L2题解(全)

目录

L2-001 紧急救援

L2-002 链表去重

L2-003 月饼

L2-005 集合相似度

L2-006 树的遍历

L2-007 家庭房产

L2-008 最长对称子串

L2-009 抢红包

L2-010 排座位

L2-011 玩转二叉树

L2-012 关于堆的判断

L2-013 红色警报

L2-014 列车调度

L2-015 互评成绩

L2-016 愿天下有情人都是失散多年的兄妹

L2-017 人以群分

L2-019 悄悄关注

L2-020 功夫传人

L2-021 点赞狂魔

L2-022 重排链表

L2-023 图着色问题

L2-024 部落

L2-025 分而治之

L2-026 小字辈

L2-027 名人堂与代金券

L2-028 秀恩爱分得快

L2-029 特立独行的幸福

L2-030 冰岛人

L2-031 深入虎穴

L2-032 彩虹瓶

L2-033 简单计算器

L2-034 口罩发放

L2-035 完全二叉树的层序遍历

L2-036 网红点打卡攻略

L2-037 包装机

L2-038 病毒溯源

L2-039 清点代码库

L2-040 哲哲打游戏

L2-041 插松枝

L2-042 老板的作息表

L2-045 堆宝塔

L2-046 天梯赛的赛场安排

L2-048 寻宝图

L2-049 鱼与熊掌

L2-050 懂蛇语

L2-051 满树的遍历

L2-052 吉利矩阵

L2-053 算式拆解

L2-055 胖达的山头

L2-056 被n整除的n位数


L2-001 紧急救援

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int N = 510, M = 5e5 + 10;

int n, m, s, d;
int e[M], ne[M], h[N], w[M], idx;
int arr[N], dist[N], cnt[N], f[N], pre[N];
bool vis[N];

void add(int a, int b, int c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}

void djikstra() {
    memset(dist, 0x3f, sizeof dist);
    priority_queue<pii, vector<pii>, greater<pii>> q;
    q.push({0,s}); dist[s] = 0; cnt[s] = 1;
    f[s] = arr[s];

    while (!q.empty()) {
        auto [ccc,u] = q.top(); q.pop();
        if (vis[u]) continue;
        vis[u] = 1;
        for (int i=h[u]; i!=-1; i=ne[i]) {
            int v = e[i];
            if (vis[v]) continue;
            if (dist[v] > dist[u] + w[i]) {
                pre[v] = u;
                dist[v] = dist[u] + w[i];
                cnt[v] = cnt[u];
                f[v] = f[u] + arr[v];
                q.push({dist[v],v});
            }
            else if (dist[v] == dist[u] + w[i]) {
                cnt[v] += cnt[u];
                if (f[v] < f[u] + arr[v]) {
                    f[v] = f[u] + arr[v];
                    pre[v] = u;
                }

            }
        }
    }

}

int main() {
    cin >> n >> m >> s >> d;
    memset(h, -1, sizeof h);
    for (int i=0; i<n; i++) cin >> arr[i];
    for (int i=1; i<=m; i++) {
        int u,v,d1; cin >> u >> v >> d1;
        add(u,v,d1);
        add(v,u,d1);
    }
    djikstra();
    cout << cnt[d] << ' ' << f[d] << endl;
    vector<int> ans;
    ans.push_back(d);
    for (int i=pre[d]; i != s; i=pre[i] ) {
        ans.push_back(i);
    }
    reverse(ans.begin(), ans.end());
    cout << s << ' ';
    for (int i=0; i<ans.size(); i++) {
        if (i) cout << ' ';
        cout << ans[i];
    }

    return 0;
}


L2-002 链表去重

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f

using namespace std;

struct ac
{
    int num,next;
}a[100005];

int vis[10005];
int b[100005];

int main()
{
    int head,n,i,x,y,z;
    memset(vis,0, sizeof(vis));
    cin>>head>>n;
    while(n--)
    {
        cin>>x>>y>>z;
        a[x].num=y;
        a[x].next=z;
    }
    printf("%05d %d ",head,a[head].num);
    int tx=abs(a[head].num);
    vis[tx]=1;
    int t=head;
    int j=0;
    while(1)
    {
        t=a[t].next;
        if(t==-1)
        {
            printf("-1\n");
            break;
        }
        tx=abs(a[t].num);
        if(!vis[tx])
        {
            vis[tx]=1;
            printf("%05d\n%05d %d ",t,t,a[t].num);
        }
        else
        {
            b[j++]=t;
        }
    }
    if(j>0)
    {
        printf("%05d %d ",b[0],a[b[0]].num);
        for(i=1;i<j;i++)
            printf("%05d\n%05d %d ",b[i],b[i],a[b[i]].num);
        printf("-1\n");
    }
    return 0;
}

L2-003 月饼

#include <cstdio>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
const int N = 1010;
 
struct Goods
{
    double w,v;
    bool operator< (const Goods& t) const
    {
        return v / w > t.v / t.w;
    }
}goods[N];
 
int main() {
    int n = 0,m = 0;
    cin >> n >> m;
    for(int i = 0;i < n;i++) cin >> goods[i].w;
    for(int i = 0; i< n;i++) cin >> goods[i].v;
    sort(goods,goods + n);
    
    double mon = 0;
    for(int i = 0;i < n;i++)
    {
        if(goods[i].w <= m)
        {
            mon += goods[i].v;
            m -= goods[i].w;
        }
        else
        {
            mon +=(double)goods[i].v * m /goods[i].w;
            m = 0;
            break;
        }
        
    }
    printf("%.2lf",mon);
    return 0;
}

L2-005 集合相似度

#include<bits/stdc++.h>

#define ll long long
using namespace  std;
const int INF = 1e9;

int main() {
    int n; cin >> n;
    map<int,bool> mp[51];
    for (int i=1;i<=n; i++) {
        int x; cin >> x;
        for (int j=1; j<=x; j++) {
            int t; cin >> t;
            mp[i][t] = 1;

        }
    }
    int t; cin >> t;
    for (int j=1; j<=t; j++) {
        int l,r; cin >> l >> r;
        int cnt = mp[l].size() + mp[r].size() ;
        int c1 = 0;
        for (auto x : mp[l]) {
            if (mp[r].count(x.first)) c1++;
        }
        printf("%.2f",(double)c1 / (double)(cnt-c1)*100.0);
        printf("%\n");
    }

}

L2-006 树的遍历

#include<bits/stdc++.h>
#define ll long long
using namespace  std;
const int INF = 1e9;

int post[44], back[44];

struct tree {
    int dat;
    tree *l = NULL, *r = NULL;
};

tree* build(int pl, int pr, int el,int er) {
    if (pl > pr) return NULL;
    tree *p = (tree*) malloc(sizeof(tree));
    p->dat = post[pr];
    int x = post[pr];
    int i = 0;
    for (i;i<31; i++) {
        if (x == back[i]) break;
    }
    p->l = build(pl,pl+(i-1-el),el,i-1);
    p->r = build(pl+(i-1-el)+1,pr-1,i+1,er);
    return p;
}

void bfs(tree *p) {
    queue<tree> q;
    q.push(*p);

    while (!q.empty()) {
        tree t = q.front();
        q.pop();
        if (t.dat != p-> dat) {
            cout << " ";
        }
        cout << t.dat;
        if (t.l!=NULL) q.push(*t.l);
        if (t.r!=NULL) q.push(*t.r);
        
    }
}

int main() {
    int n; cin>>n;
    for (int i=0; i<n; i++) cin >> post[i];
    for (int i=0; i<n; i++) cin >> back[i];
    tree *p =  build(0,n-1, 0, n-1);
    bfs(p);
}

L2-007 家庭房产

#include<bits/stdc++.h>
using namespace std;

const int N = 10000;

int fa[N];
bool vis[N];
double house[N];
double area[N];
int cnt[N];

int find(int x) {
    if (fa[x] != x) fa[x] = find(fa[x]);
    return fa[x];
}

void merge(int a, int b) {
    int ra = find(a), rb = find(b);
    if (ra != rb) {
        if (ra < rb) fa[rb] = ra;
        else fa[ra] = rb;
    }
}

struct Family {
    int id;
    int cnt;
    double avg_house;
    double avg_area;
};

int main() {
    for (int i = 0; i < N; i++) {
        fa[i] = i;
    }
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int id, father, mother, k;
        cin >> id >> father >> mother >> k;
        vis[id] = true;
        if (father != -1) {
            vis[father] = true;
            merge(id, father);
        }
        if (mother != -1) {
            vis[mother] = true;
            merge(id, mother);
        }
        for (int j = 0; j < k; j++) {
            int child;
            cin >> child;
            vis[child] = true;
            merge(id, child);
        }
        double h, a;
        cin >> h >> a;
        house[id] += h;
        area[id] += a;
    }
    for (int i = 0; i < N; i++) {
        if (vis[i]) {
            int root = find(i);
            cnt[root]++;
        }
    }
    double total_house[N] = {0};
    double total_area[N] = {0};
    for (int i = 0; i < N; i++) {
        if (vis[i]) {
            int root = find(i);
            total_house[root] += house[i];
            total_area[root] += area[i];
        }
    }
    vector<Family> families;
    for (int i = 0; i < N; i++) {
        if (vis[i] && find(i) == i) {
            families.push_back({
                i,
                cnt[i],
                total_house[i] / cnt[i],
                total_area[i] / cnt[i]
            });
        }
    }
    sort(families.begin(), families.end(), [](const Family& a, const Family& b) {
        if (fabs(a.avg_area - b.avg_area) > 1e-6) {
            return a.avg_area > b.avg_area;
        }
        return a.id < b.id;
    });
    cout << families.size() << endl;
    for (const auto& f : families) {
        printf("%04d %d %.3lf %.3lf\n", f.id, f.cnt, f.avg_house, f.avg_area);
    }
    return 0;
}

L2-008 最长对称子串

#include<bits/stdc++.h>

#define ll long long
using namespace  std;
const int INF = 1e9;

int main() {
    string s;
    getline(cin, s);
    int mx = 0, temp;
    int len = s.length();
    for(int i = 0; i < len; i++) {
        temp = 1;
        for(int j = 1; j < len; j++) {
            if(i - j < 0 || i + j >= len || s[i - j] != s[i + j])
                break;
            temp += 2;
        }
        mx = temp > mx ? temp : mx;
        temp = 0;
        for(int j = 1; j < len; j++) {
            if(i - j + 1 < 0 || i + j >= len || s[i - j + 1] != s[i + j])
                break;
            temp += 2;
        }
        mx = temp > mx ? temp : mx;
    }
    cout << mx;
    return 0;
}

L2-009 抢红包


#include<bits/stdc++.h>

#define ll long long
using namespace  std;
const int INF = 1e9;


const int N = 10010;
struct People
{
    int id,cnt;
    double mon;
}a[N];

bool cmp(People p1, People p2) {
    if (abs(p1.mon - p2.mon) > 1e-4) return p1.mon > p2.mon;
    else if (p1.cnt != p2.cnt) return p1.cnt > p2.cnt;
    else return p1.id < p2.id;
}

int main() {
    int n = 0;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        int k = 0;
        a[i + 1].id = i + 1;
        scanf("%d",&k);
        while(k--)
        {
            int id = 0;
            double mon = 0.0;
            scanf("%d%lf",&id,&mon);
            a[id].mon += mon;
            a[id].cnt++;
            a[i + 1].mon -= mon;
        }
    }
    sort(a + 1,a + 1 + n, cmp);
    for(int i = 1;i <= n;i++)
    {
        printf("%d %.2lf\n",a[i].id,a[i].mon/100);
    }
    return 0;
}

L2-010 排座位

#include<bits/stdc++.h>

#define ll long long
using namespace  std;
const int INF = 1e9;


 
const int N = 110;
 
int g[N][N];
int frind[N];
 
int find(int x)
{
    if(x != frind[x]) frind[x] = find(frind[x]);
    return frind[x];
}
int main()
{
    int n = 0,m = 0,k = 0;
    scanf("%d%d%d",&n,&m,&k);
    for(int i = 1; i<= n;i++) frind[i] = i;
    
    for(int i = 0;i < m;i++)
    {
        int a = 0,b = 0,c = 0;
        scanf("%d%d%d",&a,&b,&c);
        if(c == -1) g[a][b] = g[b][a] = c;
        else frind[find(b)] = find(a);
    }
    
    while(k--)
    {
        int a = 0,b = 0;
        scanf("%d%d",&a,&b);
        
        if(find(a) == find(b) && g[a][b] != -1) puts("No problem");
        else if(find(a) != find(b) && g[a][b] != -1) puts("OK");
        else if(find(a) == find(b) && g[a][b] == -1) puts("OK but...");
        else puts("No way");
    }
    return 0;
}

L2-011 玩转二叉树

#include<bits/stdc++.h>
#define lc p<<1
#define rc (p<<1)+1
using namespace std;

int tr[100010];
int a[5000], b[5000];
int idx = 1;
unordered_map<int, int> mp;

void f(int l, int r, int p) {
    if(l > r) {
        return;
    }
    tr[p] = b[idx++];
    int md = mp[tr[p]];
    f(l, md - 1, lc);
    f(md + 1, r, rc);
}

int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        mp[a[i]] = i;
    }
    for(int i = 1; i <= n; i++) {
        cin >> b[i];
    }
    f(1, n, 1);
    queue<int> q;
    q.push(1);
    bool fl = 0;
    while(q.size()){
        int p = q.front();
        q.pop();
        if(tr[p] == 0) continue;
        if(fl) cout << " ";
        cout << tr[p];
        fl = 1;
        q.push(rc);
        q.push(lc);
    }
    return 0;
}

L2-012 关于堆的判断

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int N = 2e3;

int tree[N];
int n, m;

void check(int id) {
    if (id > 1 && tree[id] < tree[id/2]) {
        swap(tree[id], tree[id/2]);
        check(id/2);
    }
    return ;
}

int main() {
    cin >> n >> m;
    int t = 1;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        tree[t] = x;
        check(t);
        t++;
    }
    cin.ignore();
    while (m--) {
        string s;
        getline(cin, s);
        if (s.find("root") != string::npos) {
            int x;
            sscanf(s.c_str(), "%d is the root", &x);
            if (x == tree[1]) {
                cout << "T\n";
            } else {
                cout << "F\n";
            }
        }
        else if (s.find("sib") != string::npos) {
            int x, y;
            sscanf(s.c_str(), "%d and %d are siblings", &x, &y);
            int posx = -1, posy = -1;
            for (int i = 1; i < t; i++) {
                if (tree[i] == x) posx = i;
                if (tree[i] == y) posy = i;
            }
            if (posx != -1 && posy != -1 && posx / 2 == posy / 2 && posx != posy) {
                cout << "T\n";
            } else {
                cout << "F\n";
            }
        }
        else if (s.find("parent") != string::npos) {
            int x, y;
            sscanf(s.c_str(), "%d is the parent of %d", &x, &y);
            int posx = -1, posy = -1;
            for (int i = 1; i < t; i++) {
                if (tree[i] == x) posx = i;
                if (tree[i] == y) posy = i;
            }
            if (posx != -1 && posy != -1 && posy / 2 == posx) {
                cout << "T\n";
            } else {
                cout << "F\n";
            }
        }
        else if (s.find("child") != string::npos) {
            int x, y;
            sscanf(s.c_str(), "%d is a child of %d", &x, &y);
            int posx = -1, posy = -1;
            for (int i = 1; i < t; i++) {
                if (tree[i] == x) posx = i;
                if (tree[i] == y) posy = i;
            }
            if (posx != -1 && posy != -1 && posx / 2 == posy) {
                cout << "T\n";
            } else {
                cout << "F\n";
            }
        }
    }

    return 0;
}

L2-013 红色警报

#include<bits/stdc++.h>

#define ll long long
using namespace  std;
const int maxn1 = 500;
const int maxn2 = 5005;
int count1 = 0;
int pre[maxn1];
struct edge {
	int x, y;
}e[maxn2];
int find(int x)
{
	while (x != pre[x]) x = pre[x];
	return x;
}
void merge(int x, int y)
{
	int a = find(x);
	int b = find(y);
	if (a != b) pre[a] = b;
}
void init()
{
	for (int i = 0; i < maxn1; i++) pre[i] = i;
}
int main()
{
	int n, k, x, y;
	cin >> n >> k;
	init();
	for (int i = 0; i < k; i++)
	{
		cin >> x >> y;
		e[i].x = x;
		e[i].y = y;
		merge(x, y);
	}
	for (int i = 0; i < n; i++)
	{
		if (pre[i] == i)count1++;
	}
	int flag[maxn1]{ 0 };
	int h;
	cin >> h;
	for (int i = 0; i < h; i++)
	{
		cin >> x;
		init();
		flag[x] = 1;
		int count2 = 0;
		for (int z = 0; z < k; z++)
		{
			if (flag[e[z].x] == 0 && flag[e[z].y] == 0)
			{
				merge(e[z].x, e[z].y);
			}
		}
		for (int j = 0; j < n; j++)
		{
			if (pre[j] == j && flag[j] == 0)
			{
				count2++;
			}
		}
		if (count2 > count1)
			printf("Red Alert: City %d is lost!\n", x);
		else
			printf("City %d is lost.\n", x);
		if (count2 == 0)
			printf("Game Over.\n");

		count1 = count2;
	}
}

L2-014 列车调度

#include<bits/stdc++.h>

#define ll long long
using namespace  std;
const int INF = 1e9;
int que[100004];



int main() {
    int n; cin >> n;
    int ans = 0;
    for (int i=0; i<n;i ++) {
        int x; cin >> x;
        int p = lower_bound(que,que+ans, x) - que;
        if (p == ans) que[ans++] = x;
        else que[p] = x;
    }
    cout << ans << endl;
}

L2-015 互评成绩

#include<bits/stdc++.h>

#define ll long long
using namespace  std;
const int INF = 1e9;

int main() {
    int N, k, M;
    cin >> N >> k >> M;

    vector<double> fin;

    for (int i = 0; i < N; i++) {
        vector<double> scores(k);

        for (int j = 0; j < k; j++) {
            cin >> scores[j];
        }

        sort(scores.begin(), scores.end());

        double sum = 0;
        for (int j = 1; j < k - 1; j++) {
            sum += scores[j];
        }
        double avg = sum / (k - 2);

        fin.push_back(avg);
    }

    sort(fin.begin(), fin.end());

    for (int i = N - M; i < N; i++) {
        if (i != N - M) cout << " ";
        printf("%.3f", fin[i]);
    }

    return 0;
}

L2-016 愿天下有情人都是失散多年的兄妹

#include <bits/stdc++.h>
using namespace std;
struct people
{
    int fa = -1;
    int mo = -1;
} peo[100000];
map<int, char> sex;
int flag = 0;

void dfs(set<int> &st, int t, int deep)
{
    if (deep == 6)
        return;
    if (st.count(t) == 1)
    {
        flag = 1;
        return;
    }
    st.insert(t);
    if (peo[t].fa != -1)
        dfs(st, peo[t].fa, deep + 1);
    if (peo[t].mo != -1)
        dfs(st, peo[t].mo, deep + 1);
}

void test()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int t1, t2, t3;
        char c;
        cin >> t1 >> c >> t2 >> t3;
        sex[t1] = c;
        peo[t1].fa = t2;
        peo[t1].mo = t3;
        sex[t2] = 'M';
        sex[t3] = 'F';
    }
    int m;
    cin >> m;
    for (int i = 1; i <= m; i++)
    {
        int t1, t2;
        cin >> t1 >> t2;
        if (sex[t1] == sex[t2])
            cout << "Never Mind" << endl;
        else
        {
            set<int> st;
            flag = 0;
            dfs(st, t1, 1);
            dfs(st, t2, 1);
            if (flag == 0)
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
    }
}

int main()
{
    test();
    return 0;
}

L2-017 人以群分

#include<bits/stdc++.h>
#define ll long long
using namespace  std;
const int INF = 1e9;



int main() {
    int n = 0; cin >> n;
    vector<int> a(n);
    for(int i = 0; i < n;i++) cin >> a[i];
    
    sort(a.begin(), a.end());
    int cnt = n >> 1;
    int dif1 = 0,dif2 = 0,n1 = cnt,n2 = cnt;
    for(int i = 0;i < cnt;i++) dif2 += a[i];
    for(int i = cnt;i < n;i++) dif1 += a[i];
    if(n % 2) n1++;
    printf("Outgoing #: %d\nIntroverted #: %d\nDiff = %d\n",n1,n2,abs(dif1 - dif2));

}

L2-019 悄悄关注

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

bool cmp (pair<string, int> a, pair<string, int> b) {
    return a.first < b.first;
}

int main() {
    int n; cin >> n;
    map<string,int> mp;
    for (int i=1; i<=n; i++) {
        string s; cin >> s;
        mp[s] = 1;
    }
    int x; cin >> x;
    int sum = 0;
    vector<pair<string,int>> v;
    for (int i=1; i<=x; i++) {
        string s; cin >> s;
        int c ; cin >> c;
        sum += c;
        v.push_back(make_pair(s,c));
    }
    int cnt = 0;
    double avg = (double)sum / x;
    sort(v.begin(), v.end(), cmp);
    for (auto it : v) {
        string k = it.first;
        int c = it.second;
        if (mp.find(k) == mp.end()) {
            if (c > avg) {
                cout << k << endl;
                cnt++;
            }
        }
    }
    if (cnt == 0) cout << "Bing Mei You";
}

L2-020 功夫传人

#include<bits/stdc++.h>
using namespace std;

const int LEN = 1e5 + 5;

int main() {
    int n;
    double Z, r;
    cin >> n >> Z >> r;
    vector<double> pow(n, 0);
    vector<vector<int>> child(n);
    vector<int> amp(n, 1);
    for (int i = 0; i < n; i++) {
        int k;
        cin >> k;
        if (k == 0) {
            int mul;
            cin >> mul;
            amp[i] = mul;
        } else {
            for (int j = 0; j < k; j++) {
                int id;
                cin >> id;
                child[i].push_back(id);
            }
        }
    }
    queue<int> q;
    pow[0] = Z;
    q.push(0);
    double sum = 0;
    while (!q.empty()) {
        int cur = q.front();
        q.pop();
        
        if (child[cur].empty()) {
            sum += pow[cur] * amp[cur];
        } else {
            double childPower = pow[cur] * (1 - r / 100.0);
            for (int child : child[cur]) {
                pow[child] = childPower;
                q.push(child);
            }
        }
    }
    cout << (int)sum << endl;
    return 0;
}

L2-021 点赞狂魔

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

struct people{
    string name;
    int len;
    double average;
}man[101];

double cmp(people a,people b){
    if(a.len==b.len)
        return a.average<b.average;
    return a.len>b.len;
}
int main()
{
    ios::sync_with_stdio(false);
    int n;
    set<int> up;
    while(cin>>n){
        int temp,pp;
        for(int i=0;i<n;i++){
            up.clear();
            cin>>man[i].name;
            cin>>temp;
            for(int j=0;j<temp;j++){
                cin>>pp;
                up.insert(pp);
            }
            man[i].len=up.size();
            man[i].average=(double)temp/man[i].len;
        }
        sort(man,man+n,cmp);
        n=min(n,3);
        for(int i=0;i<n;i++){
            if(i)
                cout<<" ";
            cout<<man[i].name;
        }
        for(int i=n;i<3;i++){
            if(i)
                cout<<" ";
            cout<<"-";
        }
        cout<<endl;
    }
    return 0;
}

L2-022 重排链表

#include <bits/stdc++.h>
#include<vector>
using namespace std;

typedef long long ll;

struct node{
    int id, data, next;
};

int main()
{
    int begin , n;
    cin >> begin >>n;
    node a[100003];
    vector<node> v, ans;
    for(int i = 0 ; i < n ; i++) {
        int t1, t2, t3; cin >> t1 >> t2 >> t3;
        a[t1] = {t1,t2,t3};
    }
    while (begin != -1) {
        v.push_back(a[begin]);
        begin = a[begin].next;
    }
    int l = 0 , r = v.size() - 1;
    while (1) {
        ans.push_back(v[r]);
        r--;
        if ((r+1) - (l-1) == 1) break;
        ans.push_back(v[l]);
        l++;
        if ((r+1) - (l-1) == 1) break;
    }
    for(int i = 0; i < ans.size(); i++) {
        if(i != ans.size() - 1)
            printf("%05d %d %05d\n", ans[i].id, ans[i].data, ans[i+1].id);
        else
            printf("%05d %d -1\n", ans[i].id, ans[i].data);
    }
    return 0;
}

L2-023 图着色问题

#include <bits/stdc++.h>
#include<vector>
using namespace std;

typedef long long ll;

vector<int> v[510];
bool vis[510];
int n,m,k;
int main()
{
    cin >> n >> m >> k;
    for (int cc = 0; cc < m; cc++) {
        int l, r; cin >> l >> r;
        v[l].push_back(r);
        v[r].push_back(l);
    }
    int t; cin >> t;
    while (t--) {
        int color[n+1];
        memset(vis, false, sizeof(vis));
        set<int> check;
        for (int i=1; i<=n; i++) {
            cin >> color[i];
            check.insert(color[i]);
        }
        if (check.size() != k) {
            cout << "No\n";
            continue;
        }
        else {
            int flag = 1;
            for (int i=1; i<=n; i++) {
                vector<int> c = v[i];
                for (int xx : c) {
                    if (color[xx] == color[i] && xx > i) {
                        flag = 0;
                    }
                }
            }
            if (flag) {
                cout << "Yes\n";
            }
            else {
                cout << "No\n";
            }
        }
    }
}

L2-024 部落

#include<bits/stdc++.h>
#define ll long long
using namespace  std;
const int INF = 1e9;
int fa[10003];
set<int> num;
int find(int x) {
    if (fa[x] != x) fa[x] = find(fa[x]);
    return fa[x];
}

int main() {
    int n; cin >> n;
    for (int i=1; i<=10000; i++) fa[i] = i;
    int id = 0;
    for (int i=0; i<n; i++) {
        int x; cin >> x;
        int a; cin >> a;
        num.insert(a);
        if (a>id) id = a;
        for (int i=0; i<x-1; i++) {
            int b; cin >> b;
            if (b > id) id = b;
            num.insert(b);
            fa[find(b)] = find(a);
        }
    }
    int cnt = 0;
    for (int i=1; i<=id; i++) {
        if (fa[i] == i) cnt++;
    }
    cout << num.size() << " " << cnt << endl;
    int m; cin >> m;
    for (int i=0; i<m; i++) {
        int a,b; cin >> a >> b;
        if (find(a) == find(b)) cout << "Y" << endl;
        else cout << "N" << endl;
    }
}

L2-025 分而治之

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>

int main() {
    int n,m; cin >> n >> m;
    vector<pii> e;
    bool vis[n+1];

    for (int i = 0; i < m; i++) {
        int u, v; cin >> u >> v;
        e.push_back({u,v});
    }

    int k; cin >> k;
    while (k--) {
        bool can = 0;
        memset(vis, false, sizeof(vis));
        int x; cin >> x;
        for (int i=0; i<x; i++) {
            int t; cin >> t;
            vis[t] = 1;
        }
        for (auto u : e) {
            if (vis[u.first] == 0 && vis[u.second] == 0) {
                can = 1;
            }
        }
        if (can) cout << "NO\n";
        else cout << "YES\n";
    }
}

L2-026 小字辈

#include <bits/stdc++.h>
#define pii pair<int, int>
using namespace std;

typedef long long ll;
struct S{
    vector<int> son;
    int dai;
};

int n,root;
vector<bool> vis(1e5+1);
vector<S> son(1e5 +1); // son.first = son.id,,son.second代指辈数
int main()
{
    cin >> n;
    for (int i=1; i<=n; i++) {
        int x; cin >> x;
        if (x == -1) {
            root = i;
            son[root].dai = 1;
        }
        else {
            son[x].son.push_back(i);
        }
    }
    queue<int> que;
    que.push(root);
    int mx =  1;
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        if (vis[u]) continue;
        vis[u] = true;
        for (auto x : son[u].son) {
            son[x].dai = son[u].dai + 1;
            mx = max(mx, son[x].dai);
            que.push(x);
        }
    }
    vector<int> ans;
    for (int i=1; i<=n; i++) {
        if (son[i].dai == mx) {
            ans.push_back(i);
        }
    }
    cout << mx << endl;
    sort(ans.begin(),ans.end());
    for (int i=0; i<ans.size(); i++) {
        if (i) cout << ' ';
        cout << ans[i];
    }
}

L2-027 名人堂与代金券

#include<bits/stdc++.h>
using namespace std;

bool cmp(pair<string, int> a, pair<string, int> b) {
    if (a.second != b.second) return a.second > b.second;
    return a.first < b.first;
}

int main() {
    int N, G, K;
    cin >> N >> G >> K;
    vector<pair<string, int>> stu(N);
    int total = 0;
    for (int i = 0; i < N; i++) {
        cin >> stu[i].first >> stu[i].second;
        if (stu[i].second >= G) total += 50;
        else if (stu[i].second >= 60) total += 20;
    }
    cout << total << endl;
    sort(stu.begin(), stu.end(), cmp);
    int rank = 1;
    for (int i = 0; i < N && rank <= K; i++) {
        if (i > 0 && stu[i].second != stu[i-1].second) {
            rank = i + 1;
        }
        if (rank <= K) {
            cout << rank << " " << stu[i].first << " " << stu[i].second << endl;
        }
    }
    return 0;
}

L2-028 秀恩爱分得快

#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,k,kk,xb[N],a[505],p,x,y;
double g[N][N];
string ct[N],t;
int toi(string s){
    int x=0;
    if(s[0]=='-') 
        for(int i=1; i<s.size(); i++)x*=10,x+=s[i]-'0';
    else for(int i=0; i<s.size(); i++)x*=10,x+=s[i]-'0';
    return x;
}
int main(){
    cin >> n >> m;
    while(m--){
        cin >> k; kk = k; p=0;
        while(kk--) {
            cin >> t;
            int tn=toi(t);
            if(t[0]=='-') xb[tn]=1;
            else xb[tn]=2;
            a[p++] = tn;
        }
        double k1=1.0/k;
        for(int i=0; i<k-1; i++){
            for(int j=i+1; j<k; j++){
                if(xb[a[i]] == xb[a[j]]) continue;
                g[a[i]][a[j]] += k1; g[a[j]][a[i]] = g[a[i]][a[j]];
            }
        }
    }
    cin >> t; x=toi(t);
    if(t[0]=='-') xb[x]=1; else xb[x]=2;
    cin >> t; y=toi(t);
    if(t[0]=='-') xb[y] = 1; else xb[y]=2;
    for(int i=0; i<n; i++)if(xb[i]==1)ct[i]="-";else ct[i]="";
    double ma=0, mb=0;
    for(int i=0; i<n; i++) if(xb[i]!=xb[x]) ma = max(ma,g[x][i]);
    for(int i=0; i<n; i++) if(xb[i]!=xb[y]) mb = max(mb,g[y][i]);
    if(ma==mb && g[x][y]==ma) cout << ct[x] << x << " " << ct[y] << y << endl;
    else {
        for(int i=0; i<n; i++) if(g[x][i]==ma && xb[x]!=xb[i]) cout << ct[x] << x << " " << ct[i] << i << endl;
        for(int i=0; i<n; i++) if(g[y][i]==mb && xb[y]!=xb[i]) cout << ct[y] << y << " " << ct[i] << i << endl; 
    }	
    return 0;
} 

L2-029 特立独行的幸福

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e4+3;

int A, B, flag, num[10001], notIndep[10001];
bool isPrime(int a) {
    if (a == 1) return false;
    for (int i = 2; i <= sqrt(a); i++)
        if (a % i == 0) return false;
    return true;
}
bool isIndep(int x) {
    set<int> mark;
    int X = x, temp1, temp2;
    while (X != 1) {
        mark.insert(X);
        temp1 = 0;
        while (X) {
            temp2 = X % 10;
            X /= 10;
            temp1 += temp2 * temp2;
        }
        num[x]++;
        notIndep[temp1] = 1;
        X = temp1;
        if (mark.count(X)) return false;
    } 
    return true;
}
int main() {
    cin >> a >> b;
    vector<int> ans;
    for (int i=a; i<=b; i++)
        if (isIndep(i)) ans.push_back(i);
    for (int i = 0; i < ans.size(); i++) {
        if (isPrime(ans[i])) num[ans[i]] <<= 1;
        if (!notIndep[ans[i]]) {
            cout << ans[i] << ' ' << num[ans[i]] << endl;
            flag = 1;
        }
    }
    if (!flag) cout << "SAD"; 
    return 0;
}

L2-030 冰岛人

#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9;

map<string, pair<int,string>> mp;

string check(string s1, string s2) {
    int c1 = 0, c2;
    while (s1 != "") {
        c2 = 0;
        string b = s2;
        while (b != "") {
            if (s1 == b && (c1 < 4 || c2 < 4)) {
                return "No\n";
            }
            if (c1 >= 4 && c2 >= 4) return "Yes\n";
            b = mp[b].second;
            c2++;
        }
        s1 = mp[s1].second;
        c1++;
    }
    return "Yes\n";
}

int main() {
    int n; cin >> n;
    cin.ignore();
    while (n--) {
        string s1, s2; cin >> s1 >> s2;
        if (s2.back() == 'n') {
            mp[s1].first = 1;
            mp[s1].second = s2.substr(0,s2.length() - 4);
        }
        else if (s2.back() == 'r') {
            mp[s1].first = 0;
            mp[s1].second = s2.substr(0, s2.length() - 7);
        }
        else if (s2.back() == 'm') mp[s1].first = 1;
        else mp[s1].first = 0;
    }
    int t; cin >> t;
    while (t--) {
        string s1, s2 ,t;
        cin >> s1 >> t >> s2 >> t;
        if (!mp.count(s1) || !mp.count(s2)) {
            cout << "NA\n";
        }
        else if (mp[s1].first == mp[s2].first) {
            cout << "Whatever\n";
        }
        else cout << check(s1,s2);
    }
    return 0;
}

L2-031 深入虎穴

#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9;




int main() {
    int n; cin >> n;
    vector<pair<int,vector<int>>> tre(n+1);
    vector<bool> have(n+1, 0);
    for (int i=1; i<=n; i++) {
        int t; cin >> t;
        while (t--) {
            int x ;cin >> x;
            have[x] = 1;
            tre[i].second.push_back(x);
            tre[i].first = 0;
        }
    }
    int mx=1, mxid=1;
    queue<int> q;
    int root;
    for (int i=1; i<=n; i++) if (!have[i]) root = i;
    q.push(root);
    tre[root].first = 1;
    vector<bool> vis(n+1, false);
    while (!q.empty()) {
        int u=q.front(); q.pop();
        if (vis[u]) continue;
        vis[u] = 1;
        for (auto x : tre[u].second) {
            tre[x].first = tre[u].first + 1;
            if (tre[x].first > mx) {
                mx = tre[x].first;
                mxid = x;
            }
            q.push(x);
        }
    }
    cout << mxid;
}

L2-032 彩虹瓶

#include<bits/stdc++.h>
using namespace std;

int main() {
    int n, m, k;
    cin >> n >> m >> k;
    while (k--) {
        stack<int> st;
        int need = 1;
        bool s = 1;
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            if (!s) continue;
            if (x == need) {
                need++;
                while (!st.empty() && st.top() == need) {
                    st.pop();
                    need++;
                }
            }
            else {
                st.push(x);
                if (st.size() > m) {
                    s = 0;
                }
            }
        }
        if (s && need == n + 1) {
            cout << "YES\n";
        } else {
            cout << "NO\n";
        }
    }
    return 0;
}

L2-033 简单计算器

#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
const int N = 201;


int main()
{
    stack<int> s1;
    stack<char> s2;
    int n; cin >> n;
    for(int i=0; i<n ;i++) {
        int x; cin >> x;
        s1.push(x);
    }
    for(int i=1; i<n; i++) {
        char k ;cin >> k;
        s2.push(k);
    }

    while(1) {
        if(s1.size() == 1 && s2.empty()) {
            int t = s1.top();
            cout << t;
            return 0;
        }
        char k = s2.top(); s2.pop();
        int c1 = s1.top(); s1.pop();
        int c2 = s1.top(); s1.pop();
        if(k == '-') {
            c2 = c2 - c1;
        }
        else if(k == '+') {
            c2 = c2 + c1;
        }
        else if(k == '*') {
            c2 = c2 * c1;

        }
        else {
            if(c1 == 0) {
                cout << "ERROR: " << c2 << "/0";
                return 0;
            }
            c2 = c2 / c1;

        }
        s1.push(c2);
    }
    cout << s1.top();
}





L2-034 口罩发放

#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct rec {
    string nam, id;
    int sta, h, m, idx;
};

bool ok(const string& id) {
    if (id.size() != 18) return 0;
    for (char c : id) {
        if (!isdigit(c)) return 0;
    }
    return 1;
}

bool cmp(const rec& a, const rec& b) {
    if (a.h != b.h) return a.h < b.h;
    if (a.m != b.m) return a.m < b.m;
    return a.idx < b.idx;
}

int main() {
    int d, p;
    cin >> d >> p;
    map<string, int> lst;
    map<string, bool> vis;
    vector<pair<string, string>> out;
    for (int day = 1; day <= d; day++) {
        int ti, si;
        cin >> ti >> si;

        vector<rec> cur;
        for (int i = 0; i < ti; i++) {
            string nam, id, tim;
            int sta;
            cin >> nam >> id >> sta >> tim;
            int h = stoi(tim.substr(0, 2));
            int m = stoi(tim.substr(3, 2));

            if (!ok(id)) continue;

            if (sta == 1 && !vis[id]) {
                vis[id] = true;
                out.push_back({nam, id});
            }

            cur.push_back({nam, id, sta, h, m, i});
        }

        sort(cur.begin(), cur.end(), cmp);

        int cnt = 0;
        for (auto& r : cur) {
            if (cnt >= si) break;

            if (lst.count(r.id) && day - lst[r.id] <= p) continue;

            cout << r.nam << " " << r.id << endl;
            lst[r.id] = day;
            cnt++;
        }
    }

    for (auto& p : out) {
        cout << p.first << " " << p.second << endl;
    }

    return 0;
}

L2-035 完全二叉树的层序遍历

#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
const int N = 201;
int pre[44], bac[44];



int main()
{
    int n; cin >> n;
    int cnt = 1;
    for(int i=1; i<=n; i++) cin >> bac[i];
    function<void(int)> dfs= [&] (int st) -> void {
        if(st < 1 || st > n) return ;
        dfs(st * 2);
        dfs(st * 2 + 1);
        pre[st] = bac[cnt++];
    };
    dfs(1);
    for(int i=1; i<=n; i++) {
        if(i > 1) cout << ' ';
        cout << pre[i];
    }
}





L2-036 网红点打卡攻略

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>

int G[210][210];
bool vis[220];
bool cmp(pii a, pii b) {
    if (a.second != b.second) return a.second < b.second;
    return a.first < b.first;
}

int main() {
    int n, m; cin >> n >> m;
    for (int i=0; i<m; i++) {
        int u, v, w; cin >> u >> v >> w;
        G[u][v] = w;
        G[v][u] = w;
    }
    int t; cin >> t;
    vector<int> res;
    vector<pii> can;
    for (int k=1; k<=t; k++) {
        memset(vis ,0, sizeof(vis));
        int x; cin >> x;
        int a[x+1];
        for (int i=1; i<=x; i++) {
            cin >> a[i];
            if (vis[a[i]]) vis[0] = 1;
            else vis[a[i]] = 1;
        }
        int cost = 0, now = 0;
        if (vis[0] || x != n) {
            continue;
        }
        bool f = 1;
        for (int i=1; i<=x; i++) {
            int u = a[i];
            if (G[now][u] == 0){
                f = 0;
                break;
            }
            cost += G[now][u];
            now = u;
        }
        if (G[now][0] == 0) f = 0;
        else cost += G[now][0];
        if (f) {
            can.push_back({k, cost});
        }
    }
    cout << can.size() << endl;
    sort(can.begin(), can.end(), cmp);
    cout << can[0].first << ' ' << can[0].second;
    return 0;
}

L2-037 包装机

#include <bits/stdc++.h>
#define cin std::cin
#define cout std::cout
#define endl std::endl
#define ll long long
#define pii std::pair<int, int>
const int N = 1e5 + 3;

int main() {
    int n, m, len;
    cin >> n >> m >> len;
    std::string s[n + 1];
    for (int i = 1; i <= n; i++) {
        cin >> s[i];
    }
    std::string ans = "";
    int x;
    std::stack<char> st;
    while (true) {
        cin >> x;
        if (x == -1) break;
        if (x == 0) {
            if (!st.empty()) {
                char c = st.top();
                st.pop();
                ans += c;
            }
        } else {
            if (x < 1 || x > n) continue;
            if (s[x].empty()) continue;
            if (st.size() == len) {
                if (!st.empty()) {
                    char ss = st.top();
                    st.pop();
                    ans += ss;
                }
                char k = s[x][0];
                s[x].erase(0, 1);
                st.push(k);
            } else {
                char k = s[x][0];
                s[x].erase(0, 1);
                st.push(k);
            }
        }
    }

    cout << ans << endl;
    return 0;
}

L2-038 病毒溯源

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int N = 1e4;

vector<int> no, ans;// now 为 局部最优解,,,ans为 全局最优

vector<int> v[N];
int mx = -1;
void dfs(int now, int fa, int dep) {
    if (dep > mx) {
        mx = dep;
        ans = no;
    }
    for (auto x : v[now]) {
        no.push_back(x);
        dfs(x, now, dep + 1);
        no.pop_back();
    }
    return ;
}

int main() {
    ios_base::sync_with_stdio(false);
    int n; cin >> n;
    vector<bool> vis(n, 0);
    for (int i=0; i<n; i++) {
        int t; cin >> t;
        while (t--) {
            int x; cin >> x;
            vis[x] = 1;
            v[i].push_back(x);
        }
        sort(v[i].begin(), v[i].end());
    }
    int root = -1;
    for (int i=0; i<n; i++) {
        if (!vis[i]) {
            root = i;
            break;
        }
    }
    no.push_back(root);
    dfs(root, -1, 1);
    cout << ans.size() << endl;
    for (int i=0; i<ans.size(); i++) {
        if (i) cout << ' ';
        cout << ans[i];
    }
}

L2-039 清点代码库

#include<bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    map<vector<int>, int> cnt;
    for (int i = 0; i < n; i++) {
        vector<int> a(m);
        for (int j = 0; j < m; j++) {
            cin >> a[j];
        }
        cnt[a]++;
    }
    vector<pair<vector<int>, int>> ans(cnt.begin(), cnt.end());
    sort(ans.begin(), ans.end(), [](auto& a, auto& b) {
        if (a.second != b.second) return a.second > b.second;
        return a.first < b.first;
    });
    cout << ans.size() << endl;
    for (auto& [vec, c] : ans) {
        cout << c;
        for (int x : vec) {
            cout << " " << x;
        }
        cout << endl;
    }
    return 0;
}

L2-040 哲哲打游戏

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;


int main() {
    int n,m; cin >> n >> m;
    vector<int> mp[n+1];
    int a[n+1]; memset(a, 0, sizeof a);
    for(int i=1; i<=n; i++) {
        int t; cin >> t;
        for(int j=1; j<=t; j++) {
            int x; cin >> x;
            mp[i].push_back(x);
        }
    }
    int now = 1;
    for(int a_=1; a_<=m; a_++) {
        int op; cin >> op;
        if(op == 0) {
            int x; cin >> x;
            now = mp[now][x-1];
        }
        else if(op == 1) {
            int x; cin >> x;
            a[x] = now;
            cout << now << endl;
        }
        else {
            int x; cin >> x;
            now = a[x];
        }
    }
    cout << now;
    return 0;
}

L2-041 插松枝

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;

int main() {
    int n,m,k; cin >> n >> m >> k;
    stack<int> box;
    queue<int> pusher;
    for(int i=1; i<=n; i++) {
        int x; cin >> x;
        pusher.push(x);
    }

    while(1) {
        deque<int> branch;
        while(branch.size() < k) {
            int take = -1;
            if(!box.empty() && (branch.empty() || box.top() <= branch.back())) {
                take = box.top();
                box.pop();
            } else if(!pusher.empty()) {
                int cur = pusher.front();
                if(branch.empty() || cur <= branch.back()) {
                    take = cur;
                    pusher.pop();
                } else {
                    if(box.size() < m) {
                        box.push(cur);
                        pusher.pop();
                        continue;
                    } else {
                        break;
                    }
                }
            } else {
                break;
            }
            if(take != -1) {
                branch.push_back(take);
            }
        }
        if(branch.empty()) break;
        for(int i=0; i<branch.size(); i++) {
            if(i) cout << ' ';
            cout << branch[i];
        }
        cout << '\n';
    }
    return 0;
}

L2-042 老板的作息表

#include<bits/stdc++.h>
#define ll lnog long
#define pii pair<int,int>
#define pll pair<ll,ll>
using namespace std;
const int N = 2e5 + 5;

int main () {
    ios_base::sync_with_stdio(false);
    int n; cin >> n;
    cin.ignore();
    vector<string> s(n);
    for (int i=0; i<n; i++) {
        getline(cin, s[i]);
    }
    sort(s.begin(), s.end());
    string begin = "00:00:00";
    if (s[0].find(begin) == string :: npos) {
        cout << begin << " - " << s[0].substr(0,8) << endl;
    }
    for (int i=0; i<n-1; i++) {
        if (s[i+1].find(s[i].substr(11,8)) != string :: npos) {
            continue;
        }
        cout << s[i].substr(11,8) << " - " << s[i+1].substr(0,8);
        cout << endl;
    }
    string end = "23:59:59";
    string kk = s[n-1].substr(11,8);
    if (kk != end) {
        cout << kk << " - " << end;
    }
}

L2-045 堆宝塔

#include<bits/stdc++.h>
using namespace std;

int main() {
    int n; cin >> n;
    stack<int> a, b;
    vector<int> t;
    for (int i = 0; i < n; i++) {
        int x; cin >> x;
        if (a.empty() || a.top() > x) {
            a.push(x);
        }
        else {
            if (b.empty() || b.top() < x) {
                b.push(x);
            }
            else {
                t.push_back(a.size());
                while (!a.empty()) a.pop();
                stack<int> temp;
                while (!b.empty() && b.top() > x) {
                    temp.push(b.top());
                    b.pop();
                }
                while (!temp.empty()) {
                    a.push(temp.top());
                    temp.pop();
                }
                a.push(x);
            }
        }
    }
    if (!a.empty()) {
        t.push_back(a.size());
        while (!a.empty()) a.pop();
    }
    if (!b.empty()) {
        t.push_back(b.size());
        while (!b.empty()) b.pop();
    }
    cout << t.size() << " " << *max_element(t.begin(), t.end());
    return 0;
}

L2-046 天梯赛的赛场安排

#include<bits/stdc++.h>
using namespace std;
struct uni {
    string id;
    int a, b, c;
};
bool cmp1(uni x, uni y) { return x.a > y.a; }
bool cmp2(uni x, uni y) { return x.c < y.c; }
int main() {
    int n, m;
    cin >> n >> m;
    vector<uni> u(n);
    int sum = 0;
    for (int i=0; i<n; i++) {
        cin >> u[i].id >> u[i].a;
        u[i].b = u[i].a / m;
        u[i].a %= m;
        u[i].c = i;
        sum += u[i].b;
    }
    sort(u.begin(), u.end(), cmp1);
    vector<int> v;
    for (int i=0; i<n; i++) {
        if (u[i].a == 0) continue;
        int ok = 0;
        for (int j=0; j<v.size(); j++) {
            if (u[i].a <= m - v[j]) {
                v[j] += u[i].a;
                u[i].b++;
                ok = 1;
                break;
            }
        }
        if (!ok) {
            v.push_back(u[i].a);
            u[i].b++;
        }
    }
    sort(u.begin(), u.end(), cmp2);
    for (int i=0; i<n; i++) {
        cout << u[i].id << ' ' << u[i].b << endl;
    }
    cout << sum + v.size() << endl;
    return 0;
}

L2-048 寻宝图

#include<bits/stdc++.h>
#define ll long long
using namespace  std;
const int INF = 1e9;
int dx[4] = {0,0,1,-1},
    dy[4] = {1,-1,0,0};
int main() {
    ios_base::sync_with_stdio(false);
    int n,m; cin >> n >> m;
    vector<vector<char>> mp(n, vector<char>(m,NULL));
    for (int i = 0; i < n; i++) {
        for (int j=0; j<m; j++) {
            cin >> mp[i][j];
        }
    }
    bool flag = 0;
    vector<vector<bool>> vis(n, vector<bool> (m, 0));

    function <void(int,int)> dfs = [&](int i,int j)-> void {
        if (mp[i][j] == '0') return ;
        vis[i][j] = 1;
        if (mp[i][j] != '1') flag = 1;
        for (int k=0; k<4; k++) {
            int xx = i + dx[k],
                yy = j + dy[k];
            if (xx < 0 || xx >=n || yy < 0 || yy >= m || vis[xx][yy]) continue;
            dfs(xx,yy);
        }
    };
    int c1=0, c2=0;
    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            flag = 0;
            if (mp[i][j] == '0') continue;
            if (vis[i][j]) continue;
            dfs(i,j);
            c1++;
            if (flag) c2++;
        }
    }

    cout << c1 << ' ' << c2;

}

L2-049 鱼与熊掌

#include<bits/stdc++.h>

#define ll long long
using namespace  std;
const int INF = 1e9;

int main() {
    int n,m; cin >> n >> m;
    set<int> s[n+1];
    for (int i=1; i<=n; i++ ) {
        int x; cin >> x;
        for (int j=1; j<=x; j++) {
            int c1; cin >> c1;
            s[i].insert(c1);
        }
    }
    int x; cin >> x;
    for (int i=1; i<=x; i++) {
        int a,b; cin >> a >> b;
        int ans = 0;
        for (int i=1; i<=n; i++) {
            if (s[i].find(a) != s[i].end()&&s[i].find(b)!=s[i].end()) ans++;
        }
        cout << ans << "\n";
    }
}

L2-050 懂蛇语

#include <bits/stdc++.h>

using namespace std;

map<string, vector<string>> mp;

int N;

signed main(){
    cin >> N;
    getchar();
    string s;
    for(int i=1; i<=N; i++){
        getline(cin, s);
        string tmp = "";
        for(int i=0; i<s.size(); i++){
            if((i == 0 || s[i-1] == ' ') && s[i] != ' ') tmp += s[i];
        }
        mp[tmp].push_back(s);
    }
    for(auto &x :mp){
        sort(x.second.begin(), x.second.end());
    }

    int M; cin >> M;
    getchar();
    while(M--){
        string s; getline(cin, s);
        string tmp = "";
        for(int i=0; i<s.size(); i++){
            if((!i || s[i-1] == ' ') && s[i] != ' ') tmp += s[i];
        }
        if(mp[tmp].size() == 0) cout << s << endl;
        else{
            int cnt = 0;
            for(auto &x: mp[tmp]){
                if(!cnt){
                    cout << x; ++cnt;
                }else cout << "|" << x;
            }
            cout << endl;
        }
    }
    
    return 0;
}

L2-051 满树的遍历

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int INF = 1e9;

vector<int> g[100005];
set<int> se;
int n, front, flag;

void dfs(int x) {
    if (flag) cout << " ";
    flag = 1;
    cout << x;
    sort(g[x].begin(), g[x].end());
    for (auto c : g[x]) dfs(c);
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int x; 
        cin >> x;
        if (x) g[x].push_back(i);
        else front = i;
    }
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        int c = (int)g[i].size();
        cnt = max(c, cnt);
        if (c != 0) {
            se.insert(c);
        }
    }
    if (n == 1) {
        cout << "0 yes\n";
    }
    else if (se.size() != 1) {
        cout << cnt << " no\n";
    }
    else {
        cout << cnt << " yes\n";
    }
    
    flag = 0;
    dfs(front);
    cout << endl;
    
    return 0;
}

L2-052 吉利矩阵

#include<iostream>
#include<vector>
#define cin  std:: cin
#define cout std:: cout
#define endl std:: endl
#define ll long long
#define pii pair<int, int>
const int N  = 1e5 + 3;
ll res;
int l,n;
int h[N], L[N], cnt;
int col_total[7],row_total[7];

void dfs(int x,int y)
{
    if(x==n+1&&y==1)
    {
        for(int i=1;i<=n;i++)
        {
            if(row_total[i]!=l || col_total[i]!=l)
            {
                return;
            }
        }
        cnt++;
        return;
    }
    for(int i=0;i<=9;i++)
    {
        if(col_total[x]+i<=l && row_total[y]<=l)
        {
            col_total[x]+=i;
            row_total[y]+=i;
            if(y==n && col_total[x]!=l)
            {
                col_total[x]-=i;
                row_total[y]-=i;
                continue;
            }
            if(x==n && row_total[y]!=l)
            {
                col_total[x]-=i;
                row_total[y]-=i;
                continue;
            }
            if(y<n) dfs(x,y+1);
            else    dfs(x+1,1);
            col_total[x]-=i;
            row_total[y]-=i;
        }
    }
}

int main() {
    cin >> l >> n;
    dfs(1,1);
    cout << cnt << endl;
    return 0;
}

L2-053 算式拆解

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
const int N = 2e5+1;
int tr[111], cudu[111];

signed main() {
    string s; cin >> s;
    stack<char> st;
    for (int i=0; i<s.size(); i++) {
        if (s[i] == '(') {
            st.push(s[i]);
        }
        else if (s[i] == ')'){
            stack<char> st2;
            while (st.top() != '(') {
                st2.push(st.top()); st.pop();
            }
            while (!st2.empty()) {
                cout << st2.top();
                st2.pop();
            }
            st.pop();
            cout << endl;
        }
        else {
            st.push(s[i]);
        }
    }

    return 0;
}


L2-055 胖达的山头

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define LL long long
#define PII pair<int,int>
#define pii pair<int,PII>


int a[1000010],b[1000010];
int main() {
    int n; cin >> n;
    int maxx = 0;
    while(n--)
    {
        string s1,s2;
        cin >> s1 >> s2;
        int l=0,r=0;
        l += 3600 * (10*(s1[0]-'0') + (s1[1]-'0'));
        l += 60 * (10*(s1[3]-'0') + (s1[4]-'0'));
        l += 10*(s1[6]-'0') + (s1[7]-'0');

        r += 3600 * (10*(s2[0]-'0') + (s2[1]-'0'));
        r += 60 * (10*(s2[3]-'0') + (s2[4]-'0'));
        r += 10*(s2[6]-'0') + (s2[7]-'0');
        a[l]++;
        a[r+1]--;
    }
    b[0] = a[0];
    maxx = max(maxx,b[0]);
    for(int i=1;i<=1000010;i++)
    {
        b[i]=b[i-1]+a[i];
        maxx=max(b[i],maxx);
    }
    cout << maxx << endl;
}

L2-056 被n整除的n位数

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
const int N = 2e5+1;
int tr[111], cudu[111];
int n, l, r;
set<int> ans;

void dfs(int x, int len) {
    if (x % len != 0) return;
    if (len == n) {
        if (x <= r && x >= l) ans.insert(x);
        return;
    }
    for (int i=0; i<10; i++) {
        dfs(x * 10 + i, len+1);
    }
}

signed main() {
    cin >> n >> l >> r;
    for (int i=1 ;i<=9; i++) {
        dfs(i, 1);
    }
    for (auto x : ans) {
        cout << x << endl;
    }
    if (ans.size() == 0) cout << "No Solution";
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值