牛客小白月赛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 ≤ n , q ≤ 2 × 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 号城市。城市有两种属性,一种是炎热,另一种是酷寒,每个城市是其中一种。从一个城市前往另一个城市,如果要前往的城市和当前城市的属性相同,则需要 x 时间,否则需要 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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!