ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛客小白月赛56 A-F

2022-08-27 12:32:10  阅读:170  来源: 互联网

标签:int 56 cin long 牛客 小白月赛 using include dis


牛客小白月赛56 A-F

https://ac.nowcoder.com/acm/contest/39100
一场简单的比赛就足以验证我是多么的弱智。。。

A- 阿宁的柠檬

求最大最小,签到。
注意会爆 \(int\)

#include <bits/stdc++.h>
#define int long long

using namespace std;

signed main () {
    int a, b, n;
    cin >> a >> b >> n;
    cout << n << ' ' << (a+b)*n;
}

B - 阿宁与猫咪

构造题,一看乘,那么最小就是全1

#include <bits/stdc++.h>
#define int long long

using namespace std;

signed main () {
    int m;
    cin >> m;
    cout << m << endl;
    while (m--)    cout << "1 ";
}

C - 阿宁吃粽子

还是构造
大的乘大的来构造是最优策略
先给 \(a\) 排个序,然后按照 \(0,1,2,...9\) 的顺序枚举其倍数, 依次往后填
思路是差不多了,但是码力太太太太太弱了。。。写半天都不对

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int N = 2e5 + 5;
int n, a[N], ans[N];

signed main () {
    cin >> n;
    for (int i = 1; i <= n; i++)    cin >> a[i];
    sort (a + 1, a + n + 1);
    int k = 0;

    for (int i = 0; i <= 9; i++) {
        for (int j = i; j <= n; j += 10) {
            if (!j) continue;
            ans[j] = a[++k];
        }
    }
    
    for (int i = 1; i <= n; i++)    cout << ans[i] << ' ';
}

//按照0,1,2,...9的顺序枚举其倍数,依次往后填

D - 阿宁的质数

预处理素数表,素数最多只有 \(2e5\) 个,然后直接查。
没做出来是因为线性筛筛错了。。

#include <bits/stdc++.h>
#define endl "\n"

using namespace std;
const int N = 2e5 + 5;
int n, a[N], q;
bool p[N*20]; //false表素数

int main () {
    ios::sync_with_stdio (0);cin.tie(0);cout.tie(0);
    cin >> n >> q;

    p[1] = true;
    for (int i = 2; i < N*20; ++i) {
        if (!p[i]) {
            for (int j = i + i; j < N*20; j += i) {
                p[j] = true;
            }
        }
    }
    
    set <int> s;
    int k = 1;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        if (x < N*20 && !p[x])  s.insert (x);
        while (s.count (k) || p[k])    k ++;
        a[i] = k;
    }  

    while (q --) {
        int x;
        cin >> x;
        cout << a[x] << endl;
    }
}


//只筛2e5个质数

E - 阿宁睡大觉

答案就是"EE"的个数*4,然后消除的规则是优先消去较短的夹在两个"Z"之间的"z"串
因此可以记录满足中间的所有连续"z"串的长度,用堆来挨个消。
依旧是码力太弱,虽然写出来了,但是从知道思路到实现卡了好一阵子。

#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> pii;
int n, m;
string s;

int main () {
    priority_queue <int, vector<int>, greater<int>> q;
    cin >> n >> m >> s;
    int ans = 0;
    //base
    int l = 0, r = 0, j = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'Z') {
            if (i && j)  q.push (i-j); //l=j, r=i-1;
            for (j = i + 1; j < n; j++) {
                if (s[j] == 'z') {
                    break;
                }
                ans += 4;
            }
            i = j;
        }
    }

    while (!q.empty ()) {
        int t = q.top();
        q.pop();
        m -= t;
        if (m >= 0) ans += 4;
        if (m <= 0) break;
    }

    cout << ans << endl;
    
}



//ans=4*ZZ
//把ZZ中夹着的zz删掉

F - 阿宁去游玩

由于转置不花费代价且不限次数,所以随便转,每次建最小边即可
记得开long long

#include <bits/stdc++.h>
#define int long long

using namespace std;
typedef pair<int, int> pii;
const int N = 2e5 + 5, M = N*2;
int n, m, x, y, z;
int s[N], dis[N];
int h[N], e[M], ne[M], w[M], idx;
bool vis[N];

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

int dijkstra () {
    priority_queue <pii, vector<pii>, greater<pii>> q;
    memset (dis, 0x3f, sizeof dis);
    dis[1] = 0;
    q.push ({0, 1});

    while (!q.empty ()) {
        auto t = q.top ();
        q.pop ();
        int ver = t.second, dist = t.first;

        if (vis[ver])   continue;
        vis[ver] = true;

        for (int i = h[ver]; ~i; i = ne[i]) {
            int j = e[i];
            if (dis[j] > dist + w[i]) {
                dis[j] = dist + w[i];
                q.push ({dis[j], j});
            }
        }
    }
    return dis[n];
}

signed main () {
    memset (h, -1, sizeof h);
    cin >> n >> m >> x >> y >> z;
    for (int i = 1; i <= n; i ++)   cin >> s[i];
    while (m --) {
        int a, b, c;
        cin >> a >> b;
        if (s[a] == s[b])   c = min (x, y + z);
        else    c = min (y, x + z);
        add (a, b, c), add (b, a, c);
    }

    cout << dijkstra () << endl;
}

//由于转置不花费代价且不限次数,所以随便转,每次建最小边即可

标签:int,56,cin,long,牛客,小白月赛,using,include,dis
来源: https://www.cnblogs.com/CTing/p/16630319.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有