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