ACGO欢乐赛#79题解
2026-08-17 18:14:25
发布于:福建
1.皓仔的商场折扣
题目描述
小明在商场购买了三件物品,三件物品的价格分别为 a 元、b 元和 c 元。
商场本次活动的折扣为 d 折。例如,8.5 折表示按照原价的 85% 支付。
请你计算小明最终需要支付的金额,并将结果保留 2 位小数。
输入格式
一行输入四个实数 a,b,c,d,分别表示三件物品的价格和本次活动的折扣。
输出格式
输出一个实数,表示小明最终需要支付的金额,结果保留 2 位小数。
输入输出样例
输入#1
复制
120.50 80.00 99.50 8.5
输出#1
复制
255.00
说明/提示
【样例解释】
三件物品的原价总和为 120.50+80.00+99.50=300.00 元。
本次活动为 8.5 折,因此需要支付 300.00×8.5÷10=255.00 元。
【数据范围】
对于所有测试数据,保证:
0.01≤a,b,c≤10000.00
0.1≤d≤10.0
代码实现
#include<bits/stdc++.h>
using namespace std;
int main(){
double a,b,c,d;
cin>>a>>b>>c>>d;
d/=10;
printf("%.2lf",(a+b+c)*d);//保留两位小数
return 0;
}
2.皓仔的周末活动
题目描述
周末,皓仔准备在电影、篮球和阅读三个活动中选择一个。
参加每个活动都需要花费一定的交通时间和活动时间,总时间为交通时间与活动时间之和。
已知三个活动的总时间两两不同,请你计算皓仔最少需要花费多少时间。
输入格式
输入共 3 行。
第一行输入两个整数 a,b,表示电影的交通时间和活动时间。
第二行输入两个整数 c,d,表示篮球的交通时间和活动时间。
第三行输入两个整数 e,f,表示阅读的交通时间和活动时间。
所有时间的单位均为分钟。
输出格式
输出一个整数,表示三个活动中最短的总时间。
输入输出样例
输入#1
复制
30 90
50 60
20 105
输出#1
复制
110
说明/提示
【样例解释】
电影、篮球和阅读的总时间分别为 120 分钟、110 分钟和 125 分钟,其中最短的总时间为 110 分钟。
【数据范围】
对于所有测试数据,保证:
1≤a,b,c,d,e,f≤1000
三个活动花费的总时间两两不同
代码实现
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,d,e,f;
cin>>a>>b>>c>>d>>e>>f;
cout<<min(a+b,min(c+d,e+f));//最短时间实现
return 0;
}
3.皓仔的极差筛选
题目描述
皓仔得到一个包含 n 个整数的数组。
一个数组的极差等于数组中的最大值减去最小值。
请你先计算这个数组的极差,再按照原来的输入顺序,输出数组中所有严格小于极差的数字。
如果不存在满足条件的数字,则输出 −1。
输入格式
第一行输入一个整数 n,表示数组的长度。
第二行输入 n 个整数 a
1
,a
2
,…,a
n
,表示数组中的元素。
输出格式
按照输入顺序输出所有严格小于极差的数字,相邻两个数字之间用一个空格隔开。
如果不存在满足条件的数字,则输出 −1。
输入输出样例
输入#1
复制
6
3 10 6 2 8 5
输出#1
复制
3 6 2 5
说明/提示
【样例解释】
数组中的最大值为 10,最小值为 2,极差为 10−2=8。
按照输入顺序,严格小于 8 的数字依次为 3,6,2,5。
【数据范围】
对于所有测试数据,保证:
1≤n≤10
5
0≤a
i
≤10000
代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
// 输入数组
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
// 求最大值、最小值,计算极差
int max_num = *max_element(a.begin(), a.end());
int min_num = *min_element(a.begin(), a.end());
int range = max_num - min_num;
// 筛选符合条件的元素
vector<int> ans;
for (int x : a) {
if (x < range) {
ans.push_back(x);
}
}
// 输出结果
if (ans.empty()) {
cout << -1 << endl;
} else {
for (int i = 0; i < ans.size(); ++i) {
if (i > 0) cout << " ";
cout << ans[i];
}
cout << endl;
}
return 0;
}
4.皓仔的数字统计
题目描述
皓仔得到一个 n 行 m 列的二维整数数组。
对于数组中每一个出现过的数字 x,设它在数组中一共出现了 c 次,则这个数字的统计结果为 x×c。
请你计算所有出现过的数字中,统计结果的最大值。
输入格式
第一行输入两个整数 n,m,表示二维数组的行数和列数。
接下来 n 行,每行输入 m 个整数,表示二维数组中的所有元素。
输出格式
输出一个整数,表示最大的统计结果。
输入输出样例
输入#1
复制
3 4
2 5 2 3
5 2 5 3
2 5 5 10
输出#1
复制
25
说明/提示
【样例解释】
数字 2 出现了 4 次,统计结果为 2×4=8。
数字 3 出现了 2 次,统计结果为 3×2=6。
数字 5 出现了 5 次,统计结果为 5×5=25。
数字 10 出现了 1 次,统计结果为 10×1=10。
因此最大的统计结果为 25。
【数据范围】
对于所有测试数据,保证:
1≤n,m≤1000
0≤a
i,j
≤1000
#include <iostream>
#include <unordered_map>
#include <climits>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
// 哈希表统计每个数字出现的次数 key=数字x, value=出现次数c
unordered_map<int, int> cnt;
// 遍历二维数组所有元素
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
int x;
cin >> x;
cnt[x]++;
}
}
int max_val = INT_MIN;
// 遍历哈希表计算 x*c 并找最大值
for (auto &p : cnt)
{
int res = p.first * p.second;
if (res > max_val)
{
max_val = res;
}
}
cout << max_val << endl;
return 0;
}
5.皓仔的质数公约数
题目描述
第一行输入一个整数 n,表示数字的数量。
第二行输入 n 个整数 a
1
,a
2
,…,a
n
。
输入格式
第一行输入一个整数 n,表示数字的数量。
第二行输入 n 个整数 a
1
,a
2
,…,a
n
。
输出格式
输出一个整数,表示所有数字的最大质数公约数。
如果不存在质数公约数,则输出 −1。
输入输出样例
输入#1
复制
5
60 90 150 210 330
输出#1
复制
5
输入#2
复制
3
6 25 49
输出#2
复制
-1
说明/提示
【样例解释】
样例 1 中,所有数字都能被质数 2、3、5 整除,其中最大的质数为 5。
样例 2 中,不存在能够同时整除三个数字的质数,因此输出 −1。
【数据范围】
对于所有测试数据,保证:
1≤n≤100000
2≤a
i
≤5000
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 辗转相除法求最大公约数
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
// 判断是否为质数
bool isPrime(int x)
{
if (x < 2) return false;
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
return false;
}
return true;
}
// 找出n的最大质因数
int maxPrimeFactor(int n)
{
int maxp = -1;
// 先除2
while (n % 2 == 0)
{
maxp = 2;
n /= 2;
}
// 遍历奇数因子
for (int i = 3; i * i <= n; i += 2)
{
while (n % i == 0)
{
maxp = i;
n /= i;
}
}
// 剩余本身是质数
if (n > 2)
maxp = n;
return maxp;
}
int main()
{
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
// 求整个数组的总gcd
int total_gcd = arr[0];
for (int num : arr)
{
total_gcd = gcd(total_gcd, num);
if (total_gcd == 1) break; // 提前终止
}
if (total_gcd < 2)
{
cout << -1 << endl;
}
else
{
cout << maxPrimeFactor(total_gcd) << endl;
}
return 0;
}
6.皓仔的回文子串
题目描述
皓仔得到一个只包含小写英文字母的字符串 s。
对于字符串的每一个非空连续子串,皓仔可以修改其中至多 k 个字符。每次修改可以将一个字符改成任意小写英文字母。
请你计算,有多少个子串可以在至多修改 k 个字符后变成回文串。
每个子串都需要单独判断,修改操作不会影响原字符串。起止位置不同的子串需要分别计数。
输入格式
第一行输入一个字符串 s。
第二行输入一个整数 k,表示最多可以修改的字符数量。
输出格式
输出一个整数,表示满足条件的子串数量。
输入输出样例
输入#1
复制
abcde
1
输出#1
复制
12
说明/提示
【数据范围】
对于所有测试数据,保证:
1≤∣s∣≤200
字符串 s 只包含小写英文字母
0≤k≤∣s∣
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int k;
cin >> s >> k;
int n = s.size();
int ans = 0;
// 1. 奇数长度回文,中心i
for (int i = 0; i < n; i++)
{
int l = i, r = i;
int change = 0;
while (l >= 0 && r < n)
{
if (s[l] != s[r])
change++;
if (change <= k)
ans++;
else
break; // 修改超k,再往外更不行,直接退出
l--;
r++;
}
}
// 2. 偶数长度回文,中心i和i+1
for (int i = 0; i < n - 1; i++)
{
int l = i, r = i + 1;
int change = 0;
while (l >= 0 && r < n)
{
if (s[l] != s[r])
change++;
if (change <= k)
ans++;
else
break;
l--;
r++;
}
}
cout << ans << endl;
return 0;
}
这里空空如也




















有帮助,赞一个