C++刷题

简介: acwing寒假每日一题4655重新排序。给定一个数组 A 和一些查询 Li,Ri,求数组中第 Li 至第 Ri 个元素之和。小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?

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];

}


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;

}


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;

}

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 的值。


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;

   }

};

return ans;

}

};

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

目录
相关文章
|
算法 C语言 C++
从C语言的使用转换到C++(上篇)——刷题、竞赛篇
从C语言的使用转换到C++(上篇)——刷题、竞赛篇
280 0
|
存储 C++
【五一创作】C++刷题 【入门4】数组
【五一创作】C++刷题 【入门4】数组
134 0
|
机器学习/深度学习 存储 人工智能
【c++百日刷题计划】 ———— DAY12,奋战百天,带你熟练掌握基本算法
【c++百日刷题计划】 ———— DAY12,奋战百天,带你熟练掌握基本算法
216 0
|
7月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
7月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
8月前
|
C语言 C++
【C语言/C++】牛客网刷题训练-12
【C语言/C++】牛客网刷题训练-12
|
8月前
|
存储 自然语言处理 C++
刷题用到的非常有用的函数c++(持续更新)
刷题用到的非常有用的函数c++(持续更新)
91 1
|
存储 C语言 C++
【C/C++刷题——leetcode】查找字符串中最大的子串
【C/C++刷题——leetcode】查找字符串中最大的子串
348 0
|
机器学习/深度学习 人工智能 C++
【c++百日刷题计划】 ———— DAY16,刷题百天,养成刷题好习惯
【c++百日刷题计划】 ———— DAY16,刷题百天,养成刷题好习惯
193 0
【c++百日刷题计划】 ———— DAY16,刷题百天,养成刷题好习惯
|
存储 算法 C++
【c++百日刷题计划】 ———— DAY13,奋战百天,带你熟练掌握基本算法
【c++百日刷题计划】 ———— DAY13,奋战百天,带你熟练掌握基本算法
365 0