2024牛客寒假算法基础集训营2

2024牛客寒假算法基础集训营2

A.Tokitsukaze and Bracelet

签到题,就不多赘述

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        int sum = 0;
        if (a == 150) sum++;
        else if (a == 200) sum += 2;

        if (b >= 34 && b <= 40) sum++;
        if (b == 45) sum += 2;

        if (c >= 34 && c <= 40) sum++;
        if (c == 45) sum += 2;

        cout << sum << endl;
    }
}

b. Tokitsukaze and Cats

思路:很简单就是两只猫相邻的时候会重合一个网格-1就行(WA了一发,没好好看样例、、、给墙也减了个1)

#include <bits/stdc++.h>

using namespace std;
const int MAX = 310;
bool st[MAX][MAX] = {false};

signed main() {
    int m, n, k;
    cin >> m >> n >> k;
    int sum = 0;
    vector<pair<int, int>> mp(k + 1);
    for (int i = 0; i < k; i++) {
        int a, b;
        cin >> a >> b;
        mp[i].first = a;
        mp[i].second = b;
        st[a][b] = true;
    }
    for (int i = 0; i < k; i++) {
        if (st[mp[i].first + 1][mp[i].second]) sum++;
        if (st[mp[i].first][mp[i].second + 1]) sum++;
    }
    cout << k * 4 - sum << endl;
}

E.Tokitsukaze and Eliminate (easy)

思路:反正只有两种颜色,那么很明显两种颜色靠前的一个应该被删(之前有个错就是num1直接给的1很明显假设只剩一个这个就是大错特错、、、)

#include <bits/stdc++.h>

using namespace std;
#define int long long

void solve() {
    int n;
    cin >> n;
    vector<int> col(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> col[i];
    }
    int num1 = 0, num2 = 0, ans = 0;
    for (int i = n; i >= 1; i--) {
        if (col[i] == 1) num1++;
        if (col[i] == 2) num2++;
        if (num1 && num2) {
            num1 = 0;
            num2 = 0;
            ans++;
        }
    }
    ans = ans + num1 + num2;
    cout << ans << endl;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

F. Tokitsukaze and Eliminate (hard)

思路:还是从后往前,怎么保证他是最优的"删除点"? 可以利用set的唯一性来统计总类,当他的总类等于便利颜色的总量的时候就可以保证下一个必须是重合的。不论是不是只有一个,这个都是最后一个删除的

#include <bits/stdc++.h>

using namespace std;

void solve(){
    int n;
    cin>>n;
    vector<int> num(n+1);
    vector<int> col(n+1);
    int res=0;//颜色的种类
    for(int i=1;i<=n;i++){
        cin>>col[i];
        num[col[i]]++;
        if(num[col[i]]==1) res++;
    }
    set<int> q;
    int ans=0,p=0;
    for(int i=n;i>0;i--){
        q.insert(col[i]);
        num[col[i]]--;
        if(num[col[i]]==0) p++;
        if(res==q.size()){
            q.clear();
            ans++;
            res-=p;
            p=0;
        }
    }
    cout<<ans<<endl;
}

signed main()
{
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

I.Tokitsukaze and Short Path (plus)

$$
化简=
\begin{cases}
0& \text{u=v}\
2*max(a_u,a_v)& \text{u!=v}
\end{cases}
$$

思路:上面化简了可以晓得权重是取决于最大那个点,又知道了a[i]都是正数,那么最小的就是直达

#include <bits/stdc++.h>

using namespace std;
#define int long long

void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    int ans = 0;
    for (int i = 0; i < n; i++) {
        ans += a[i] * i * 4;
    }
    cout << ans << endl;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

J. Tokitsukaze and Short Path (minus)

$$
化简=
\begin{cases}
0& \text{u=v}\
2*min(a_u,a_v)& \text{u!=v}
\end{cases}
$$

思路:和上面只变了一点点,那么我们就可以加一种特殊情况,就是过不过最小点

#include <bits/stdc++.h>

using namespace std;
#define int long long

void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    int ans = 0;
    for(int i = 0;i < n - 1; i++){
        ans += min(a[0] * 4 , a[i] * 2) * 2 * (n - i - 1);
    }
    cout << ans << endl;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

K.Tokitsukaze and Password (easy)

思路:easy版本我一般就是先看看暴力,这题数据小,最多就4个字母一个_,那么数量级最大也就1e5,那就狠狠暴力

#include <bits/stdc++.h>

using namespace std;
map<int, bool> mp;

void solve() {
    int n, y;
    cin >> n;
    string s;
    cin >> s;
    cin >> y;
    mp.clear();
    for (char a = '0'; a <= '9'; a++)
        for (char b = '0'; b <= '9'; b++)
            for (char c = '0'; c <= '9'; c++)
                for (char d = '0'; d <= '9'; d++)
                    for (char _ = '0'; _ <= '9'; _++) {
                        if (a == b || a == c || a == d || b == c || b == d || c == d)continue;
                        string st = s;
                        for (int i = 0; i < n; i++) {
                            if (st[i] == 'a') st[i] = a;
                            if (st[i] == 'b') st[i] = b;
                            if (st[i] == 'c') st[i] = c;
                            if (st[i] == 'd') st[i] = d;
                            if (st[i] == '_') st[i] = _;
                        }
                        if (n > 1 && st[0] == '0')continue;
                        int k = stoi(st);
                        if (k <= y && !(k % 8)) mp[k] = true;
                    }
    cout << mp.size() << '\n';
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
posted @   goodluckbear  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示