奇怪的捐赠
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int main(){// 初始化变量num为1000000,代表总金额为100万元int num = 1000000;// 初始化变量cnt为0,用于记录最终划分的份数int cnt = 0;// 当num不为0时,持续进行循环,此循环的目的是将总金额按七进制拆分while(num) {// num % 7 计算出当前num在七进制下的最低位数字// 这个数字代表了当前7的0次方(即1元)这一份额的数量// 将其累加到cnt中cnt += num % 7;// num /= 7 相当于将num在七进制下右移一位// 也就是去掉当前七进制表示中的最低位,继续处理更高位num /= 7;}// 输出最终划分的份数cout << cnt;return 0;
}
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;int main() {// 初始金额为100万元,单位为元int money = 1000000;// 用于记录划分的份数,初始化为0int cnt = 0;// 从7的0次方到7的7次方进行遍历,这里k表示7的幂次,从大到小遍历for(int k = 7; k >= 0; k--) {// 计算当前7的k次幂能划分出的份数,即总金额除以当前7的幂次方int numitems = money / pow(7, k);// 如果划分出的份数大于5份,按照要求最多只能取5份if(numitems > 5) numitems = 5;// 将当前划分的份数累加到总份数cnt中cnt += numitems;// 从总金额中减去当前划分所使用的金额money -= numitems * pow(7, k);// 如果总金额已经为0,说明已经全部分完,跳出循环if(money == 0) break;}// 输出划分的总份数cout << cnt;return 0;
}
排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;// 自定义比较函数 cmp,用于降序排序
bool cmp(int a, int b) {return a > b;
}int main() {int n;cin >> n;// 使用 vector 动态数组存储输入的整数vector<int> a(n);for (int i = 0; i < n; i++) {cin >> a[i];}// 升序排序sort(a.begin(), a.end());for (int i = 0; i < n; i++) {cout << a[i];if (i < n - 1) {cout << " ";}}cout << "\n";// 降序排序sort(a.begin(), a.end(), cmp);for (int i = 0; i < n; i++) {cout << a[i];if (i < n - 1) {cout << " ";}}return 0;
}
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;// 定义一个常量 maxn,用于数组的最大长度,这里设置为 1e9 + 9
const long long maxn = 5e5+9;
// 定义一个整数数组 a,用于存储输入的整数
long long a[maxn];// 自定义比较函数 cmp,用于降序排序
bool cmp(long long a, long long b) {// 如果 a 大于 b,则返回 true,否则返回 falsereturn a > b;
}int main() {// 定义一个整数 n,用于存储输入整数的数量long long n;// 从标准输入读取整数 ncin >> n;// 循环读取 n 个整数,并存储到数组 a 中for (long long i = 0; i < n; i++) {cin >> a[i];}// 使用 sort 函数对数组 a 进行升序排序,默认情况下 sort 是升序排序sort(a, a + n);// 循环输出升序排序后的数组元素,元素之间用空格分隔for (long long i = 0; i < n; i++) {cout << a[i];if (i < n - 1) {cout << " ";}}// 输出换行符cout << "\n";// 使用 sort 函数和自定义比较函数 cmp 对数组 a 进行降序排序sort(a, a + n, cmp);// 循环输出降序排序后的数组元素,元素之间用空格分隔for (long long i = 0; i < n; i++) {cout << a[i];if (i < n - 1) {cout << " ";}}return 0;
}
4. 浓缩咖啡液【算法赛】
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;int main(){// 定义变量 t,用于存储测试用例的数量int t;// 从标准输入读取测试用例的数量cin >> t;// 循环处理每个测试用例while(t--){// 定义变量 n 和 m,n 表示数组的长度,m 是一个比较值int n, m;// 从标准输入读取数组长度 n 和比较值 mcin >> n >> m;// 定义一个大小为 n 的整数向量 v,用于存储数组元素vector<int> v(n);// 循环读取 n 个整数,并将它们存入向量 v 中for(int i = 0; i < n; i++) {cin >> v[i];}// 定义两个标志变量 a 和 b,初始值都为 0// a 用于标记数组中是否存在小于等于 m 的元素// b 用于标记数组中是否存在大于等于 m 的元素int a = 0, b = 0;// 遍历向量 v 中的每个元素for(int i = 0; i < n; i++){// 如果当前元素等于 mif(v[i] == m){// 同时将 a 和 b 置为 1,表示既存在小于等于 m 的元素(就是 m 本身),也存在大于等于 m 的元素(就是 m 本身)a = 1;b = 1;} // 如果当前元素小于 melse if(v[i] < m){// 将 a 置为 1,表示存在小于等于 m 的元素a = 1;} // 如果当前元素大于 melse if(v[i] > m) {// 将 b 置为 1,表示存在大于等于 m 的元素b = 1;}}// 如果 a 和 b 都为 1,说明数组中既存在小于等于 m 的元素,又存在大于等于 m 的元素if(a && b) {// 输出 "YES" 并换行cout << "YES\n";} // 否则else {// 输出 "NO" 并换行cout << "NO\n";}}return 0;
}
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;// 定义一个常量 maxn 作为数组的最大长度
const int maxn = 1010;
// 定义一个整型数组 a,用于存储输入的数字,数组大小为 maxn
int a[maxn];int main()
{// 定义变量 t 用于存储测试用例的数量int t;// 从标准输入读取测试用例的数量cin >> t;// 循环处理每个测试用例,t-- 表示每次循环后 t 的值减 1,直到 t 为 0 时停止循环while(t--){// 定义变量 n 用于存储当前测试用例中数组的元素个数,m 用于存储目标值int n, m;// 从标准输入读取 n 和 m 的值cin >> n >> m;// 循环读取 n 个整数,将它们依次存入数组 a 中for(int i = 0; i < n; i++) {cin >> a[i];}// 使用 sort 函数对数组 a 进行升序排序,a 是数组起始地址,a + n 是数组结束地址的下一个位置sort(a, a + n);// 判断目标值 m 是否在排序后数组的最小值和最大值之间(包括边界值)if(m >= a[0] && m <= a[n - 1]) {// 如果满足条件,输出 "YES" 并换行cout << "YES\n";} else {// 如果不满足条件,输出 "NO" 并换行cout << "NO\n";}}return 0;
}
破译密码【算法赛】
#include <bits/stdc++.h>
using namespace std;
// 使用类型别名 ll 来表示 long long 类型,方便后续代码编写
using ll = long long;// 定义一个结构体 t 来表示芯片
// 每个芯片有两个属性:l 表示解密时间,r 表示传输时间
struct t {ll l, r; // l 为解密时间,r 为传输时间
} a[1010];// 自定义比较函数 cmp,用于对芯片数组进行排序
// 排序规则决定了芯片处理的顺序,以使得总时间最短
bool cmp(t a1, t a2) {// 比较两个芯片的解密时间和传输时间的某种组合// 这里的规则是根据 min(a1.l, a2.r) 和 min(a2.l, a1.r) 的大小来排序return min(a1.l, a2.r) < min(a2.l, a1.r);
}// 定义全局变量
// n 表示芯片的数量
// ans 用于记录最终的最小总时间
// sum 用于记录当前累计的解密时间
ll n, ans, sum;int main() {// 从标准输入读取芯片的数量 ncin >> n;// 循环读取每个芯片的解密时间,并存储在数组 a 中for (int i = 1; i <= n; i++) {cin >> a[i].l;}// 循环读取每个芯片的传输时间,并存储在数组 a 中for (int i = 1; i <= n; i++) {cin >> a[i].r;}// 使用自定义的比较函数 cmp 对芯片数组 a 进行排序// 排序范围是从 a[1] 到 a[n]sort(a + 1, a + n + 1, cmp);// 遍历排序后的芯片数组for (int i = 1; i <= n; i++) {// 累加当前芯片的解密时间到 sum 中sum += a[i].l;// 判断当前累计的解密时间 sum 是否大于等于之前记录的总时间 ansif (sum >= ans) {// 如果 sum 大于等于 ans,说明当前芯片的解密完成后才开始传输,更新总时间 ansans = sum + a[i].r;} else {// 如果 sum 小于 ans,说明前一个芯片的传输还未完成,当前芯片的传输接着进行,更新总时间 ansans = ans + a[i].r;}}// 输出最终的最小总时间cout << ans << "\n";return 0;
}
#include <bits/stdc++.h>
using namespace std;
// 使用typedef为long long定义一个别名ll,方便后续代码书写
typedef long long ll;// 定义一个结构体t,用于表示芯片,每个芯片有两个属性
struct t {ll l, r; // l: 破译时间, r: 传输时间
} a[1010];// Johnson算法的比较函数,用于对芯片数组进行排序,以找到最优处理顺序
bool cmp(t a1, t a2) {// 比较两个芯片的r和另一个芯片的l的较小值// 这里是Johnson算法的关键比较部分if (min(a1.r, a2.l) == min(a2.r, a1.l)) {// 当min(a1.r, a2.l)等于min(a2.r, a1.l)时// 按破译时间l升序排列,即a1.l较小的排在前面// 若两个芯片比较的关键值相等,则优先处理破译时间短的芯片return a1.l < a2.l;}// 若min(a1.r, a2.l)和min(a2.r, a1.l)不相等// 返回min(a2.r, a1.l) < min(a1.r, a2.l) 的结果// 这一步是Johnson算法核心比较逻辑,通过这样的比较决定芯片的排序// 让满足此条件的芯片a1排在a2前面,以此来优化整体处理时间return min(a2.r, a1.l) < min(a1.r, a2.l);
}int main() {int n;// 从标准输入读取芯片的数量cin >> n;// 循环读取每个芯片的破译时间,并存储在数组a中for (int i = 1; i <= n; i++) cin >> a[i].l;// 循环读取每个芯片的传输时间,并存储在数组a中for (int i = 1; i <= n; i++) cin >> a[i].r;// 使用自定义的比较函数cmp对芯片数组a进行排序// 排序范围是从a[1]到a[n]// 经过排序后,芯片会按照能使总处理时间最短的顺序排列sort(a + 1, a + n + 1, cmp);// sum用于记录累计的破译时间// ans用于记录完成所有芯片处理的最小总时间ll sum = 0, ans = 0;// 遍历排序后的芯片数组for (int i = 1; i <= n; i++) {// 累加当前芯片的破译时间到sum中sum += a[i].l;// 计算当前芯片处理完后的总时间// 取ans和sum中的较大值,是因为要考虑前一个芯片传输未完成的情况// 然后加上当前芯片的传输时间// 若前一个芯片传输还未结束,当前芯片需等待,所以取较大值ans = max(ans, sum) + a[i].r;}// 输出完成所有芯片处理的最小总时间cout << ans << "\n";return 0;
}
插入数字【算法赛】
#include <cstdio>
#include <iostream>
// 包含 string 头文件,因为代码中使用了 std::string 类型
#include <string>
using namespace std;int main(){// 定义一个字符串变量 s,用于存储从标准输入读取的字符串string s;// 从标准输入读取一个字符串,并将其存储到变量 s 中cin >> s;// 判断字符串 s 的长度是否为 1 且该字符串唯一的字符为 '0'if(s.size() == 1 && s[0] == '0') {// 如果满足条件,输出数字 9cout << 9;}// 计算一个值并存储在变量 sum 中// 计算规则是字符串 s 的长度加 1 后再乘以 9long long sum = (s.size() + 1) * 9;// 输出计算得到的 sum 值cout << sum;// 程序正常结束,返回 0return 0;
}
#include <iostream>
#include <string>
#include <set>using namespace std;int main() {// 定义一个字符串变量 num_str 用于存储输入的正整数string num_str;// 从标准输入读取一个正整数,并将其作为字符串存储到 num_str 中cin >> num_str;// 定义一个集合 unique_nums 用于存储插入数字后得到的不同数字// 集合的特性是元素唯一,可自动去重set<string> unique_nums;// 遍历可插入的数字,范围是 0 到 9for (int insert_num = 0; insert_num <= 9; ++insert_num) {// 将插入的数字转换为字符形式char insert_char = insert_num + '0';// 在数字开头插入字符// 若插入的数字不是 0 时才进行插入操作,避免生成以 0 开头的无效数字if (insert_num != 0) {string new_num = string(1, insert_char) + num_str;unique_nums.insert(new_num);}// 在数字结尾插入字符string new_num_end = num_str + string(1, insert_char);unique_nums.insert(new_num_end);// 在数字的相邻数字之间插入字符for (int i = 1; i < num_str.length(); ++i) {string new_num_middle = num_str.substr(0, i) + string(1, insert_char) + num_str.substr(i);unique_nums.insert(new_num_middle);}}// 输出集合中不同数字的数量,即通过插入操作能得到的不同数字的种类数cout << unique_nums.size() << endl;return 0;
}
试题 A :跑步训练
【问题描述】
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为 10000 。如果小明跑步,每分钟损耗 600 的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达 0,他就停止锻炼。请问小明在多久后停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。答案中只填写数,不填写单位。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include <iostream>
using namespace std;int main() {int n = 10000;int i, ans = 0;// 检查初始体力值是否为 0if (n == 0) {cout << ans;return 0;}while (true) {for (i = 1; i <= 60; i++) {n -= 10; // 每秒钟损耗 10 的体力ans += 1;if (n <= 0) {cout << ans;return 0; // 体力耗尽,程序结束}}for (i = 1; i <= 60; i++) {n += 5;ans += 1;}}return 0;
}