牛客小白月赛56_题解

A.阿宁的柠檬

复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a,b,n;//开long long 
int main()
{
    cin >> a >> b >> n;
    ll maxx = (a + b) * n;
    cout << n << " " << maxx;
    return 0;
}
复制代码

 

B.阿宁与猫咪

复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n;
int main()
{
     cin >> n;
     cout << n << "\n";
     for(int i = 1; i <= n; i ++) {
         cout << "1" << " ";
     }
     
    return 0;
}
复制代码

 

C.阿宁吃粽子

复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long

const int maxn = 2e5 + 50;
int a[maxn], b[maxn];
int num[20];
ll n;

int getmi(int x) {
    int mi = 2;
    for(int i = 1; i < x; i ++) {
        mi *= 2;
    }
    return mi;
}
 
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    int m = n / 10, res = n % 10;
    for(int i = 0; i < 10; i ++) {
        num[i] = m; 
        if(res && i && i <= res) num[i] ++;
    }
    sort(a + 1, a + 1 + n);//从小到大
    int index = 0;
    for(int i = 0; i < 10; i ++) {
        for(int j = 1; j <= num[i]; j ++) {
            if(i == 0) {
                b[10 * j] = a[++ index];
            }
            else {
                b[10 * (j - 1) + i] = a[++ index];
            }
        } 
    }
    for(int i = 1; i <= n; i ++) {
        cout << b[i] << " ";
    }
    return 0;
}
复制代码

 

D.阿宁的质数

 题意:阿宁有一个长度为 n 的正整数数组 a,她有很多次询问,每次询问:在数组 a 的前 x 个数中,未出现的最小质数是多少?1 ≤ ≤ × 105,1 ≤ ai ≤ 1e9,1 ≤x ≤n。

  注意:在判断a[ i ]有没有出现过的时候,由于我们只需要筛出前2e5 + 1个素数,整个筛选范围扩大到3e6即可,所以vis数组的大小我们开到了3e6,而a数组范围可以到1e9,如果不加判断会超限,显示段错误 。if(a[i] < N) vis[a[ i ] = 1。

复制代码
#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 20;
const int N = 3e6 + 20;
int n, m;
int isprime[N],prime[N], cnt,vis[N];
int a[maxn], ans[maxn];

void getprime() {
    memset(isprime, 1, sizeof(isprime));
    isprime[1] = 0;
    for(int i = 2; i <= N; i ++) {
        if(isprime[i]) {
            prime[++ cnt] = i;
        }
        for(int j = 1; j <= cnt && prime[j] * i <= N; j ++) {
            isprime[i * prime[j]] = 0;
            if(i % prime[j] == 0) break;
        }
    }
}

int main()
{
    cin >> n >> m;
    getprime();
    
    int pos = 1;
    for(int i = 1; i <= n; i ++) {
        cin >> a[i];
        if(a[i] <= N) vis[a[i]] = 1;//没有范围判断,直接段错误,数组越界 
        while(vis[prime[pos]]) pos ++;
        ans[i] = prime[pos];
    }
    for(int i = 1; i <= m ; i ++) {
        int x;
        cin >> x;
        cout << ans[x] << "\n";
    } 
    
    return 0;
    
}
复制代码

 

E.阿宁睡大觉

 题意:给定一个长度为 n 的字符串 s ,字符串由两种字母: 'z',  'Z' 构成。

定义Sum = , w(z)=0, w(Z)=2。有m次操作,每次操作可以删掉s中的字母' z'。求 sum 的最大值。

  题解:在开头和末尾的‘z’就算删掉也不会对sum有影响,所以只记录中间出现的‘z’连续序列的长度就行,然后从小到达排序,看最多能删除几段。

复制代码
#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 20;
int n, m;
string s;
int sum;
priority_queue<int, vector<int>, greater<int>> q;//小根堆

int main() {
    cin >> n >> m;
    cin >> s;
    int st = 0, ed = n - 1;
while (s[st] == 'z') st ++; while (s[ed] == 'z') ed --;
for (int i = st; i <= ed; ) { int num = 0; if (s[i] == 'z') { while (s[i] == 'z') { i ++; num ++; } q.push(num); } else { while (s[i] == 'Z') { i ++; num ++; } sum += 4 * (num - 1); } } while (!q.empty()) { int t = q.top(); q.pop(); if (m >= t) { m -= t; sum += 4; } else break; } cout << sum << "\n"; return 0; }

复制代码

 

F.阿宁去游玩

  共有 n 个城市, 起点在 1号城市,目的地 n 号城市。城市有两种属性,一种是炎热,另一种是酷寒,每个城市是其中一种。从一个城市前往另一个城市,如果要前往的城市和当前城市的属性相同,则需要 时间,否则需要 y 时间;通过一次操作可以使除了目前所在城市的所有属性发生变化(炎热变酷寒,酷寒变炎热),花费z时间,操作次数不受限制。问至少最少需要多少时间到达目的地。

   本题是一个单源最短路问题,套用dijkstra模板即可。需要注意的是,在使用一次操作的时候,除自身外其他点发生属性变化并不会影响后续点,因为都发生变化相当于相对没有变化。

复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6 + 20;
const ll inf = 1e18 + 10;

int x, y, z;
int n, m;
int a[maxn];
int head[maxn], cnt;
int vis[maxn];
ll dis[maxn];

struct Node {
    int to;
    int w;
    int next;
} e[maxn * 5];

struct node {
    int id;
    ll dis;//dis帮助id排序 
    bool operator < (const node & x) const {
        return x.dis < dis;
    }
};


priority_queue<node>q;

void add(int x, int y, int w) {
    e[++ cnt].to = y;
    e[cnt].w = w;
    e[cnt].next = head[x];
    head[x] = cnt;
}

void init() {
    for (int i = 1; i <= n; i ++) {
        dis[i] = inf;
    }
    dis[1] = 0;
}

//扩展完成的点已达最优解,在后续节点中也不会被更新,符合贪心 
void dijkstra() {
    init();
    q.push((node){1, 0});
    while(!q.empty()) {
        int x = q.top().id; 
        q.pop();
        
        if(vis[x]) continue;
        vis[x] = 1;
        
        for(int i = head[x]; i; i = e[i].next) {
            int y = e[i].to;
            if(e[i].w + dis[x] < dis[y]) {
                dis[y] = dis[x] + e[i].w;
                q.push((node){y, dis[y]});
            }
        }
    } 
}


int main() 
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    cin >> n >> m;
    cin >> x >> y >> z;
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    for (int i = 1; i <= m; i ++) {
        int u, v;
        cin >> u >> v;
        if(a[u] == a[v]) {
            add(u, v, min(x, y + z));
            add(v, u, min(x, y + z));
        }
        else {
            add(u, v, min(y, x + z));
            add(v, u, min(y, x + z));
        }
    }

    dijkstra();
    
    cout << dis[n] << "\n";
    return 0;
}
复制代码

 

posted @   Y2ZH  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示