[题目][蓝桥杯PREV] 大合集
【合集内容】
PREV-8 至 PREV-14
【空缺】
PREV-11 PREV-12
蓝桥杯 PREV-8 买不到的数目
问题描述:
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n, m; 5 6 int main() { 7 cin >> n >> m; 8 if (n > m) swap(n, m); 9 cout << n * (n - 2) + (m - n) * (n - 1); 10 return 0; 11 }
蓝桥杯 PREV-9 大臣的旅费
问题描述:
很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。
为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。
J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。
聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。
J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define MAXN 10005 5 6 class Edge { 7 public: 8 int v, nxt, w; 9 } e[MAXN]; 10 11 int n, u, v, w, dis[MAXN], mx, s, o, h[MAXN]; 12 13 void add(int u, int v, int w) { 14 o++, e[o] = (Edge) {v, h[u], w}, h[u] = o; 15 } 16 17 void dfs(int o, int f) { 18 for (int x = h[o]; x; x = e[x].nxt) { 19 int v = e[x].v; 20 if (v == f) continue; 21 dis[v] = dis[o] + e[x].w; 22 dfs(v, o); 23 } 24 } 25 26 int main() { 27 cin >> n; 28 for (int i = 1; i < n; i++) { 29 cin >> u >> v >> w; 30 add(u, v, w), add(v, u, w); 31 } 32 dfs(1, 0); 33 for (int i = 1; i <= n; i++) 34 if (dis[i] > mx) mx = dis[i], s = i; 35 memset(dis, 0, sizeof(dis)), mx = 0; 36 dfs(s, 0); 37 for (int i = 1; i <= n; i++) 38 mx = max(mx, dis[i]); 39 cout << 10 * mx + mx * (mx + 1) / 2; 40 return 0; 41 }
蓝桥杯 PREV-10 幸运数
问题描述:
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成
首先从1开始写出自然数1,2,3,4,5,6,....
1 就是第一个幸运数。
我们从2这个数开始。把所有序号能被2整除的项删除,变为:
1 _ 3 _ 5 _ 7 _ 9 ....
把它们缩紧,重新记序,为:
1 3 5 7 9 .... 。这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被3整除!! 删除的应该是5,11, 17, ...
此时7为第3个幸运数,然后再删去序号位置能被7整除的(19,39,...)
最后剩下的序列类似:
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, ...
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define MAXN 1000005 5 6 int l, r, x, o, f, m, ans, a[MAXN]; 7 8 priority_queue <int, vector<int>, greater<int> > h; 9 10 int main() { 11 cin >> l >> r; 12 for (int i = 1; i <= r; i++) 13 h.push(i); 14 a[1] = 2; 15 while (1) { 16 x = o = 0, m = a[++f]; 17 while (!h.empty()) { 18 int t = h.top(); 19 x++, h.pop(); 20 if (x % m) a[++o] = t; 21 } 22 if (o == x) break; 23 for (int i = 1; i <= o; i++) 24 h.push(a[i]); 25 } 26 for (int i = 1; i <= o; i++) 27 ans += l < a[i] && a[i] < r; 28 cout << ans; 29 return 0; 30 }
蓝桥杯 PREV-13 网络寻路
问题描述:
X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。
源地址和目标地址可以相同,但中间节点必须不同。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define MAXN 20005 5 6 class Edge { 7 public: 8 int v, nxt; 9 } e[MAXN]; 10 11 int u, v, n, m, ans, vis[MAXN], h[MAXN], o; 12 13 void add(int u, int v) { 14 e[++o] = (Edge) {v, h[u]}, h[u] = o; 15 } 16 17 void dfs(int o, int d, int s) { 18 if (d == 3) { 19 ans++; 20 return; 21 } 22 for (int x = h[o]; x; x = e[x].nxt) { 23 int v = e[x].v; 24 if (!vis[v]) vis[v] = 1, dfs(v, d + 1, s), vis[v] = 0; 25 else if (v == s && d == 2) dfs(v, d + 1, s); 26 } 27 } 28 29 int main() { 30 cin >> n >> m; 31 for (int i = 1; i <= m; i++) 32 cin >> u >> v, add(u, v), add(v, u); 33 for (int i = 1; i <= n; i++) 34 vis[i] = 1, dfs(i, 0, i), vis[i] = 0; 35 cout << ans; 36 return 0; 37 }
蓝桥杯 PREV-14 高僧斗法