C++刷题20230106

18 篇文章 4 订阅

acwing寒假每日一题4655重新排序

给定一个数组 A 和一些查询 Li,Ri,求数组中第 Li 至第 Ri 个元素之和。

小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。

小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?

输入格式
输入第一行包含一个整数 n。

第二行包含 n 个整数 A1,A2,⋅⋅⋅,An,相邻两个整数之间用一个空格分隔。

第三行包含一个整数 m 表示查询的数目。

接下来 m 行,每行包含两个整数 Li、Ri,相邻两个整数之间用一个空格分隔。

输出格式
输出一行包含一个整数表示答案。

https://www.acwing.com/solution/content/159822/
https://www.acwing.com/solution/content/159794/

查分我是真不会啊,赶快去学了呜呜呜呜

acwing寒假每日一题4652纸张尺寸

在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm×841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm×594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。

将 A1 纸沿长边对折后为 A2 纸,依此类推。

输入纸张的名称,请输出纸张的大小。

输入格式
输入一行包含一个字符串表示纸张的名称,该名称一定是 A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。

输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。

打表:🤣

#include<bits/stdc++.h>
using namespace std;
int a[11]={1189,841,594,420,297,210,148,105,74,52,37};
int main()
{
    char ch;
    cin>>ch;
    int n;
    cin>>n;
    cout<<a[n]<<'\n'<<a[n+1];
}

算法(模拟) O(1)
https://www.acwing.com/solution/content/151792/

acwing寒假每日一题4656技能升级

小蓝最近正在玩一款 RPG 游戏。

他的角色一共有 N 个可以加攻击力的技能。

其中第 i 个技能首次升级可以提升 Ai 点攻击力,以后每次升级增加的点数都会减少 Bi。

⌈AiBi⌉(上取整)次之后,再升级该技能将不会改变攻击力。

现在小蓝可以总计升级 M 次技能,他可以任意选择升级的技能和次数。

请你计算小蓝最多可以提高多少点攻击力?

输入格式
输入第一行包含两个整数 N 和 M。

以下 N 行每行包含两个整数 Ai 和 Bi。

输出格式
输出一行包含一个整数表示答案。

思路在这里:https://www.acwing.com/solution/content/160564/

AC code

#include <iostream>
#include <cmath>
#define N 100005
using namespace std;

int n, m, l = 0, r = 1e6, mid, now, cnt, a[N], b[N];
long long ans;

long long sum (int r, int n, int t) // 求和
{
    int l = r - t * (n - 1);
    return (long long) (l + r) * n >> 1;
}

bool check (int x)
{
    long long res = 0;
    for (int i = 1; i <= n; i ++)
    {
        if (a[i] > x) // 前提条件
        {
            res += ceil ((double) (a[i] - x) / b[i]);
            // 累计第 i 个技能发动的次数
        }
    }
    return res <= m; // 判断是否合法
}

int main ()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i] >> b[i];
    }
    while (l < r) // 二分
    {
        mid = l + r >> 1;
        if (check (mid)) // 如果 x = mid 合法
        {
            r = mid;
        }
        else
        {
            l = mid + 1;
        }
    }
    for (int i = 1; i <= n; i ++)
    {
        if (a[i] > l) // 前提条件
        {
            now = ceil ((double) (a[i] - l) / b[i]), cnt += now;
            // now 是第 i 个技能发动的次数,cnt 则是总共升级了多少次
            ans += sum (a[i], now, b[i]);
            // 总升级攻击力累加上右端点为 a[i],项数为 now,公差为 b[i] 的等差数列和
        }
    }
    cout << ans + (long long) l * (m - cnt); // 答案还要记得加上那些等于 l 的攻击力增加
    return 0;
}

作者:JcWing
链接:https://www.acwing.com/solution/content/160564/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

leetcode2023 1.6每日一题2180统计各位数字之和为偶数的整数个数

给你一个正整数 num ,请你统计并返回 小于或等于 num 且各位数字之和为 偶数 的正整数的数目。

正整数的 各位数字之和 是其所有位上的对应数字相加的结果。

示例 1:

输入:num = 4
输出:2
解释:
只有 2 和 4 满足小于等于 4 且各位数字之和为偶数。
示例 2:

输入:num = 30
输出:14
解释:
只有 14 个整数满足小于等于 30 且各位数字之和为偶数,分别是:
2、4、6、8、11、13、15、17、19、20、22、24、26 和 28 。

提示:

1 <= num <= 1000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-integers-with-even-digit-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

C语言暴力枚举

int countEven(int num) {
    int res = 0;
    for (int i = 1; i <= num; i++) {
        int x = i, sum = 0;
        while (x) {
            sum += x % 10;
            x /= 10;
        }
        if (sum % 2 == 0) {
            res++;
        }
    }
    return res;
}

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/count-integers-with-even-digit-sum/solution/tong-ji-ge-wei-shu-zi-zhi-he-wei-ou-shu-rvqol/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

C++方法一:枚举

class Solution {
public:
    int countEven(int num) {
        int ans = 0;
        for (int i = 1; i <= num; ++i) {
            int s = 0;
            for (int x = i; x; x /= 10) {
                s += x % 10;
            }
            ans += s % 2 == 0;
        }
        return ans;
    }
};
时间复杂度 O(n \times \log n)O(n×logn),空间复杂度 O(1)O(1)。其中 nn 为 numnum 的值。

作者:lcbin
链接:https://leetcode.cn/problems/count-integers-with-even-digit-sum/solution/by-lcbin-dq6j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

C++方法二:数学(这种我还不是很理解),遇到题的时候还是要多思考,多去尝试,再去学习题解
在这里插入图片描述

class Solution {
public:
    int countEven(int num) {
        int ans = num / 10 * 5 - 1;
        int s = 0;
        for (int x = num / 10; x > 0; x /= 10) {
            s += x % 10;
        }
        ans += (num % 10 + 2 - (s & 1)) >> 1;
        return ans;
    }
};
时间复杂度 O(\log n)O(logn),空间复杂度 O(1)O(1)。其中 nn 为 numnum 的值。

作者:lcbin
链接:https://leetcode.cn/problems/count-integers-with-even-digit-sum/solution/by-lcbin-dq6j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  return ans;
}

};
时间复杂度 O(\log n)O(logn),空间复杂度 O(1)O(1)。其中 nn 为 numnum 的值。

作者:lcbin
链接:https://leetcode.cn/problems/count-integers-with-even-digit-sum/solution/by-lcbin-dq6j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时雨h

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

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

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

打赏作者

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

抵扣说明:

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

余额充值