2024年团体程序设计天梯赛-总决赛

一:L1阶题

L1-1 编程解决一切

#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;

int main()
{
    cout << "Problem? The Solution: Programming." << endl;
    return 0;
}

L1-2 再进去几个人

#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;

int main()
{
    cin >> n >> m;
    cout << m - n << endl;
    return 0;
}

 L1-3 帮助色盲

注意:当前方有人但是黄灯时,应该选择"stop"其他情况根据题意模拟即可 

#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;

int main()
{
    cin >> n >> m;
    if(m)
    {
        cout << "-" << endl;
        if(n == 0)cout << "stop" << endl;
        else if(1 == n)cout << "move" << endl;
        else cout << "stop" << endl;
    }
    else 
    {
        if(0 == n)cout << "biii" << endl << "stop" << endl;
        else if(1 == n)cout << "dudu" << endl << "move" << endl;
        else cout << "-" << endl << "stop" << endl;
    }
    return 0;
}

 L1-4 四项全能

很简单,根据题意说法模拟即可,需注意ans为0的情况即可

 

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k, d, x, y;
int ans = 0;
signed main()
{
    cin >> n >> m;
    for(int i = 1;i <= m;i++)
    {
        cin >> k;ans += k;
    }
    cout << max((long long)0, ans - n * (m - 1)) << endl;
    return 0;
}


L1-5 别再来这么多猫娘了!

补题:

#include <bits/stdc++.h>

using namespace std;

int n, k, cnt;
string str;
vector<string> limits;

int main() {
    cin >> n; cin.get();
    for (int i = 1; i <= n; i++) {
        getline(cin, str);
        limits.push_back(str);
    }
    cin >> k; cin.get();
    getline(cin, str);
    //1.禁词可能是“<censored>”的子串 2.违禁词可能是另一个违禁词的子串
    for (auto c : limits) {
       while (str.find(c) != string::npos) {
           str.replace(str.find(c), c.length(), "-");
           cnt ++;
       }
    }
    while (str.find("-") != string::npos)
    str.replace(str.find("-"), 1, "<censored>");
    
    if (cnt >= k) cout << cnt << "\nHe Xie Ni Quan Jia!\n";
    else cout << str << endl;
    return 0;
}

L1-6 兰州牛肉面

依旧模拟

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k, d, x = 1, y;
double ans = 0;
double p[110];
int num[110];
signed main()
{
    cin >> n;
    for(int i = 1;i <= n;i++)cin >> p[i];
    while(x)
    {
        cin >> x >> y;
        num[x] += y;
        ans += p[x] * y;
    }
    for(int i = 1;i <= n;i++)cout << num[i] << endl;
    printf("%.2lf",ans);
    return 0;
}


L1-7 整数的持续性

还是模拟

#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;
map<int,int>id;
int mx = 0,sum = 0;
void solve(int x)
{
    int fx = x;
    string s = to_string(fx);
    int t = 0;
    while(s.size() > 1)
    {
        t += 1;
        int cnt = 1;
        for(auto i : s)
        cnt *= (i - '0');
        s = to_string(cnt);
    }
    if(mx < t)
    {
        mx = t;
        sum = 1;
    }
    else if(mx == t)sum += 1;
    id[x] = t;
}
int main()
{
    cin.tie(0) -> sync_with_stdio(false);
    cin >> n >> m;
    for(int i = n; i <= m;i++)
    {
        solve(i);
    }
    cout << mx << endl;
    for(auto &x : id)
    if(x.second == mx)
    {
        sum -= 1;
        cout << x.first;
        if(sum)cout << ' ';
    }
    return 0;
}

L1-8 九宫格

#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<string>
#include<cmath>
#include<bitset>
#include<sstream>//切割strtream头文件
#include<climits>//INT_MAX文件
#include <utility>
using i64 = int64_t;
using namespace std;
#define int i64
#define endl '\n'
#define AC return 0;
#define WA cout << "SHU_YUAN" << endl;
const int maxn = 1e6 + 10;
int n, m, k, d, T = 1, A, B;

bool isValidSudoku(vector<vector<char>>& board)
{
    bool tr[9][10] = { 0 };
    bool le[9][10] = { 0 };
    bool box[9][10] = { 0 };
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++) 
        {
            int num = board[i][j] - '0';
            if (tr[i][num])return false;
            if (le[j][num])return false;
            if (box[i / 3 + j / 3 * 3][num])return false;
            tr[i][num] = true;
            le[j][num] = true;
            box[i / 3 + j / 3 * 3][num] = true;
        }
    }
    return true;
}

void solve()
{
	vector<vector<char>> v;
    bool is = true;
	for(int i = 1;i <= 9;i++)
	{
		v.emplace_back();
		for(int j = 1;j <= 9;j++)
		{
			int ch;cin >> ch;
            if(ch < 1 || ch > 9)is = false;
			v.back().emplace_back(ch + '0');
		}
	}
	if(!is)cout << 0 << endl;
	else cout << isValidSudoku(v) << endl;
}

signed main() {
    cin.tie(0) -> sync_with_stdio(false);
    int T = 1;
    cin >> T;
    while (T--) solve();
    return 0;
}

二:L2阶题

L2-1 鱼与熊掌

思路:

1:set的下标表示物品代号,set存放的元素表示有该物品的所有人 

2:对于x y,通过对每一个人循环查找得到答案

3:cin输入需要取消流同步

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 1e5 + 10;
int n, m, k, d, x = 1, y;
double ans = 0;
set<int>s[maxn];
signed main()
{
    cin.tie(0) -> sync_with_stdio(false);
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
    {
        cin >> k;
        while(k--)
        {
            cin >> x;
            s[x].insert(i);
        }
    }
    cin >> k;
    while(k--)
    {
        cin >> x >> y;
        int cnt = 0;
        for(int i = 1;i <= n;i++)
        if(s[x].find(i) != s[x].end() && s[y].find(i) != s[y].end())cnt += 1;
        cout << cnt << endl;
    }
    return 0;
}

L2-2 懂蛇语

思路:

1:对每一个语句进行简化处理

2:给每一个不同的简化语句int标记

3:查找时通过map查看是否有对于简化语句输出即可

4:使用set存放答案最后一个测试点不通过(原因暂时未知)

#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<string>
#include<cmath>
#include<bitset>
#include<sstream>//切割strtream头文件
#include<climits>//INT_MAX文件
#include <utility>
using i64 = int64_t;
using namespace std;
#define int i64
#define endl '\n'
#define AC return 0;
#define WA cout << "SHU_YUAN" << endl;
const int maxn = 1e5 + 10;
int n, m, k, d, T = 1, A, B;
string s;
vector<string>S[maxn];
int cnt;
map<string,int>M;
string Tf(string &x)
{
	bool is = true;
	string t;
	for(int i = 0;i < x.size();i++)
	{
		if(x[i] == ' ')is = true;
		if(is && x[i] != ' ')
		{
			t += x[i];
			is = false;
		}
	}
	return t;
}

void solve()
{
	cin >> n;getline(cin, s);
	for(int i = 1;i <= n; i++)
	{
		getline(cin, s);
		string t = Tf(s);
		if(M.find(t) == M.end())
		{
			M[t] = ++cnt;
			S[cnt].emplace_back(s);
		}
		else S[M[t]].emplace_back(s);
	}
	cin >> m;getline(cin, s);
	for(int i = 0;i <= cnt;i++)sort(S[i].begin(),S[i].end());
	for(int i = 1;i <= m;i++)
	{
		getline(cin, s);
		string t = Tf(s);
		if(M.find(t) == M.end())cout << s << endl;
		else
		{
			int p = S[M[t]].size();
			for(auto &i : S[M[t]])
			{
				cout << i;
				p--;if(p >= 1)cout << '|';
			}
			cout << endl;
		}
	}
}

signed main() {
    cin.tie(0) -> sync_with_stdio(false);
    int T = 1;
    while (T--) solve();
    return 0;
}

L2-3 满树的遍历

思路:树的先序遍历,只需要判断非叶子结点的度和根的度是否一致即可

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n, m, k, d, T = 1, mx;
vector<int>v[maxn], ans;
bool is = true;
void pre_f(int x)
{
	if(v[x].empty())return;
	sort(v[x].begin(),v[x].end());
	if(x && v[x].size() != mx)is = false;
	for(int i = 0;i < v[x].size();i++)
	{
		ans.emplace_back(v[x][i]);
		pre_f(v[x][i]);
	}
}

void solve()
{
	 cin >> n;
	 for(int i = 1;i <= n;i += 1)
	 {
	 	cin >> m;
	 	v[m].emplace_back(i);
	 }
	 mx = v[v[0][0]].size();	 
	 pre_f(0);
	 cout << mx << (is ? " yes" : " no") << endl;
	 for(int i = 0;i < n;i++)
	 cout << ans[i] << (i == n - 1 ? '\n' : ' ');
}

signed main() {
    cin.tie(0) -> sync_with_stdio(false);
    while (T--) solve();
    return 0;
}

L2-4 吉利矩阵

dfs剪枝 

#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<string>
#include<cmath>
#include<bitset>
#include<sstream>//切割strtream头文件
#include<climits>//INT_MAX文件
#include <utility>
using i64 = int64_t;
using namespace std;
#define int i64
#define endl '\n'
#define AC return 0;
#define WA cout << "SHU_YUAN" << endl;
const int maxn = 1e6 + 10;
int n, m, k, d, T = 1, A, B, l, ans;
int lx[15], ly[15];
void solve(int x, int y)
{
    if(x == n + 1)
    {
    	ans += 1;return;
    }
    for(int i = 0;i <= l - max(lx[x], ly[y]); i++)
    {
        lx[x] += i;ly[y] += i;
        if(y < n) solve(x, y + 1);
        else if(y == n && lx[x] == l)solve(x + 1, 1);
        lx[x] -= i;ly[y] -= i;
    }
}

signed main() {
    cin.tie(0) -> sync_with_stdio(false);
    cin >> l >> n;
    solve(1, 1);
    cout << ans << endl;
    return 0;
}

三:L3阶题

L3-1 夺宝大赛

思路:从大本营BFS到每一个可达距离,找到唯一最短单位时间的队伍即可

#include<bits/stdc++.h>
using namespace std;
int n, m, k, d, x, y;
int a[110][110];
bool is[110][110];
bool vis[110][110];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
map<pair<int,int>,int>id;
struct Node
{
    int x, y;
    int step;
    Node(int a, int b, int c) {x = a, y = b, step = c;}
};
vector<Node>ans;
void Bfs()
{
    queue<Node>Q;
    Q.emplace(Node{x, y, 0});
    vis[x][y] = true;
    while(!Q.empty())
    {
        auto now = Q.front();
        Q.pop();
        for(int i = 0;i < 4;i++)
        {
            int tx = now.x + dx[i];
            int ty = now.y + dy[i];
            if(1 <= tx && tx <= n && 1 <= ty && ty <= m && !vis[tx][ty] && a[tx][ty])
            {
                vis[tx][ty] = true;
                if(is[tx][ty])ans.emplace_back(Node{tx, ty, now.step + 1});
                Q.emplace(Node{tx, ty, now.step + 1});
            }
        }
    }
}

int main()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            cin >> a[i][j];
            if(2 == a[i][j])x = i, y = j;
        }
    }
    cin >> k;
    for(int i = 1;i <= k;i++)
    {
        int tx = 0, ty = 0;
        cin >> ty >> tx; is[tx][ty] = true;
        id[make_pair(tx, ty)] = i;
    }
    Bfs();
    sort(ans.begin(),ans.end(),[&](auto x, auto y)
         {
             return x.step < y.step;
         });
    ans.insert(ans.begin(), Node{0, 0,-1});
    ans.emplace_back(Node{0, 0,-1});
    for(int i = 1;i <= ans.size() - 2;i++)
    {
        if(ans[i].step != ans[i - 1].step && ans[i].step != ans[i + 1].step)
        {
            cout << id[make_pair(ans[i].x, ans[i].y)] << ' ' << ans[i].step << endl;
            return 0;
        }
    }
    cout << "No winner." << endl;
    return 0;
}

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码 大学生软件杯大赛参赛作品,供参赛人员参考,含设计文档,设计源码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值