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       88
  10.25       65
  56.14        9S
 104.65        9
 100.30       88
 297.15        50
  26.75       65
 130.62        50
 240.28       58
 270.62        8
 115.87       88
 247.34       95
  73.21        9
 101.00        50
  79.54        50
 278.44        7
 199.26        50
  12.97        9
 166.30       78
 125.50       58
  84.98        9
 113.35       68
 166.57        50
  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        50
 218.37        50
 289.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;
}
  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜·肉多多·狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值