本文主要是介绍buctoj——2024寒假集训 进阶训练赛 (十七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题 A: Rescue
老题了,去年C题
问题 B: Oil Deposits
老老题了,E
问题 C: [蓝桥杯2022初赛] 九进制转十进制
题目描述
九进制正整数(2022) 转换成十进制等于多少?
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
const int N = 210, mod = 1e9 + 7;
char g[N][N];// LL qpow(int a, int b, int p){
// LL res = 1 % p;
// while(b){
// if(b & 1) res = res * a % p;
// a = (LL)a * a % p;
// b >>= 1;
// }
// return res;
// }void solve()
{cout << 2 + 2 * 9 + 2 * 9 * 9 * 9 << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;//cin >> t;while(t -- ) solve();system("pause");return 0;
}
问题 D: [蓝桥杯2022初赛] 砍竹子
题目描述
这天,小明在砍竹子,他面前有 n 棵竹子排成一排,一开始第 i 棵竹子的高度为 hi.
他觉得一棵一棵砍太慢了,决定使用魔法来砍竹子。
魔法可以对连续的一段相同高度的竹子使用,假设这一段竹子的高度为H,
那么使用一次魔法可以把这一段竹子的高度都变为:
其中 ⌊x⌋ 表示对 x 向下取整。
小明想知道他最少使用多少次魔法可以让所有的竹子的高度都变为1。
输入
第一行为一个正整数 n,表示竹子的棵数。
第二行共 n 个空格分开的正整数 hi,表示每棵竹子的高度。
20%的测试数据:n ≤ 1000; hi ≤ 10^6。
100%的测试数据:n ≤ 2 × 10^5; hi ≤ 10^18。
输出
一个整数表示答案。
样例输入
6
2 1 4 2 6 7
样例输出
5
提示
其中一种方案:
2 1 4 2 6 7
→ 2 1 4 2 6 2
→ 2 1 4 2 2 2
→ 2 1 1 2 2 2
→ 1 1 1 2 2 2
→ 1 1 1 1 1 1
共需要 5 步完成。
思路
贪心的思想很容易想到,我们每次都得砍最高的,最高的变短之后又可能会与比较小的同高一起砍。实现方法是用优先队列存pair,first是高度,second是第几棵树。
需要注意的是可能有一棵(或几棵)树很高,砍过一刀后还是最高的,所以需要边砍边更新队列。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int, int> PII;
const int N = 210, mod = 1e9 + 7;
priority_queue<PII> q;
int res;void solve()
{int n;cin >> n;for (int i = 0; i < n; i ++ ){int a;cin >> a;if(a != 1) q.push({a, i});}while(q.size()){int cnt = 1;PII t = q.top();q.pop();int num = t.second;int a = sqrt(t.first / 2 + 1);if (a != 1) q.push({a, num});while(q.size() && t.first == q.top().first && num - q.top().second <= 1){num --;q.pop();if(a != 1) q.push({a,num});}res ++;}cout << res << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;//cin >> t;while(t -- ) solve();system("pause");return 0;
}
问题 E: 老虎机
题目描述
有一台老虎机,它有三个格子,每个格子可以显示的数字为
中的整数。
但是这个老虎机很奇怪,每投一次硬币,它只会随机改变其中一个格子的数字,并且和原来显示的数字一定不相同。
如果你投币后,老虎机显示的三个数字恰好都相同,那么你就可以获得大奖。
现在你已知当前老虎机上显示的数字,你是否有可能在仅投币一次的机会中获得大奖?
输入
输入仅一行,输入三个
中的整数,以空格隔开。
输出
如果有可能获得大奖,请输出 Yes
否则请输出 No
样例输入
1 1 4
样例输出
Yes
提示
样例1解释:可以变成 1 1 1,这样就能获得大奖。
样例输入2
7 7 7
样例输出2
No
样例2解释:请注意原先的数字一定会改变一个
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int, int> PII;
const int N = 210, mod = 1e9 + 7;void solve()
{int a, b, c;cin >> a >> b >> c;if (a == b && a == c && b == c|| a != b && a != c && b != c) cout << "No" << endl;else cout << "Yes" << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;//cin >> t;while(t -- ) solve();system("pause");return 0;
}
问题 F: 产品检测
题目描述
有一批产品,里面有 n 件货物,每一件货物的参数是 ai 。
当一件产品的参数是奇数,3的倍数或者5的倍数,该产品即为合格,否则不合格。
请问这批产品是否全部合格?
输入
输入第一行,一个整数 n代表产品数量。
输入第二行,n个整数 代表每个产品参数。
输出
如果这批产品均合格,请输出 APPROVED
否则请输出 DENIED
样例输入
5
6 7 9 10 31
样例输出
APPROVED
样例输入2
3
28 27 24
样例输出2
DENIED
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int, int> PII;
const int N = 210, mod = 1e9 + 7;void solve()
{int n;cin >> n;bool flag = true;while(n -- ){int a;cin >> a;if (a%3 == 0 || a % 5 == 0 || a % 2 == 1) continue;else {flag = false;break;}}if (flag) cout << "APPROVED" << endl;else cout << "DENIED" << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;//cin >> t;while(t -- ) solve();system("pause");return 0;
}
问题 H: [蓝桥杯2017初赛]购物单
题目描述
小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。
老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。
这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。
小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。
现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。
取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。
你的任务是计算出,小明最少需要取多少现金。
输入
本题无输入,购物单如下,物品名称被隐藏了。
**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折
**** 130.62 半价
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半价
**** 79.54 半价
**** 278.44 7折
**** 199.26 半价
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半价
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半价
**** 218.37 半价
**** 289.69 8折
需要说明的是,88折指的是按标价的88%计算,而8折是按80%计算,余者类推。
特别地,半价是按50%计算。
输出
输出一个整数表示小明要从取款机上提取的金额,单位是元。
思路
用vscode很方便就能稍改一下数据:
180.90 8810.25 6556.14 9S104.65 9100.30 88297.15 5026.75 65130.62 50240.28 58270.62 8115.87 88247.34 9573.21 9101.00 5079.54 50278.44 7199.26 5012.97 9166.30 78125.50 5884.98 9113.35 68166.57 5042.56 981.90 95131.78 8255.89 78109.17 9146.69 68139.33 65141.16 78154.74 859.42 885.44 68293.70 88261.79 6511.30 88268.27 58128.29 88251.03 8208.39 75128.88 7562.06 9225.87 7512.89 7534.28 7562.16 58129.12 50218.37 50289.69 8
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int, int> PII;
const int N = 210, mod = 1e9 + 7;void solve()
{// double a, b, sum = 0;// while(cin >> a >> b){// if(b < 10) sum += a * b * 0.1;// else sum += a * b * 0.01;// }// if (sum - (int)sum / 100 * 100) cout << (int)sum / 100 * 100 + 100 << endl;// else cout << sum << endl;cout << 5200 << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;//cin >> t;while(t -- ) solve();system("pause");return 0;
}
问题 K: 轮回
题目描述
在十万年前有一个神奇的数字 n 和 k,每过一天 n 就会变成 n - k 的绝对值
假设你现在是四维空间的神,可以看到 n 在每次变化后的所有状态
能告诉我在这些状态中 n 的最小值吗?
输入
输入两个整数,n,k < 1e18
输出
变化中
可以取到的最小值
样例输入
7 4
样例输出
1
提示
在第一天N变为7-4的绝对值 等于3
第二天变成3-4的绝对值 等于1
可以发现再怎么变也不能比1更小了
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int, int> PII;
const int N = 210, mod = 1e9 + 7;void solve()
{ int n, k;cin >> n >> k;int res = n - n / k * k;res = min(res, k - res);cout << res << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;//cin >> t;while(t -- ) solve();system("pause");return 0;
}
问题 L: 幸运数字
题目描述
富哥最近迷上了数字7,如果一个数的某一位是7,那么富哥则认为这个数是他的幸运数字。
给你一个正整数n,请判断是不是富哥的幸运数字。
输入
n < 1000
输出
如果这个数是幸运数那么输出Yes,否则输出No。
样例输入
117
样例输出
Yes
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int, int> PII;
const int N = 210, mod = 1e9 + 7;void solve()
{ int n;cin >> n;if (n % 10 == 7 || n / 10 % 10 == 7 || n / 100 == 7){cout << "Yes" << endl;}else{cout << "No" << endl;}
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;//cin >> t;while(t -- ) solve();system("pause");return 0;
}
问题 M: 幸运数字2
题目描述
哥哥看富哥有了幸运数字,于是他也想拥有自己的幸运数字,可是他喜欢的数太多了,他除了不喜欢3的倍数和5的倍数外,其他的数他都喜欢,都是他的幸运数字。现在他想知道在1到n(包含1,n)中他的幸运数字的和是多少。
输入
n < 1e6
输出
1到n中哥哥的幸运数字之和。
样例输入
1000000
样例输出
266666333332
思路
通过等差数列求和公式,算出总和减去三的倍数的和,减去五的倍数的和,加上既是三又是五的倍数的和。当然在可以暴力的情况下也不是必须的。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int, int> PII;
const int N = 210, mod = 1e9 + 7;void solve()
{ int n;cin >> n;int sum = 0;for (int i = 1; i <= n; i ++ ){if (i % 3 != 0 && i % 5 != 0) sum += i;}cout << sum << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;//cin >> t;while(t -- ) solve();system("pause");return 0;
}
这篇关于buctoj——2024寒假集训 进阶训练赛 (十七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!