当前位置: 首页 > news >正文

GESP25年9月编程题解析

一级

商店折扣

水题:

#include <iostream>
using namespace std;
int main()
{int x,y,n;cin >> x >> y >> n;  // 读取满减门槛 x、减免金额 y、折扣 ndouble p;cin >> p;  // 读取商品总价 pdouble ans1 = p;  // 存储第一种方案的支付金额,初始为原价double ans2 = p;  // 存储第二种方案的支付金额,初始为原价if(ans1 >= x)ans1 -= y;  // 若满足满减条件,应用第一种方案(满 x 减 y)ans2 = ans2 * n / 10;  // 应用第二种方案(打 n 折,即乘以 n / 10)if(ans1 < ans2)printf("%.2lf",ans1);  // 比较两种方案,输出较少的支付金额(保留两位小数)else printf("%.2lf",ans2);return 0;
}

金字塔

水题:

#include <iostream>
using namespace std;
int main()
{int n;cin >> n;  // 读取输入的金字塔层数 nint ans = 0;  // 定义变量 ans 用于存储总石块数,初始化为 0// 从第 n 层开始向下计算到第 1 层,累加每层的石块数for(int i = n;i >= 1;i -- )ans += i * i;cout << ans << endl;  // 输出总石块数return 0;
}

二级

优美的数字

水题,数位拆分:

#include <iostream>
using namespace std;
int main()
{int n;cin >> n;int ans = 0;for(int i = 1;i <= n;i ++ ){int t = i;int vis = t % 10;int flag = 1;while(t > 0){int num = t % 10;if(num != vis){flag = 0;break;}t /= 10;}if(flag)ans ++ ;}cout << ans << endl;return 0;
}

菱形

解题思路:

老套的打印图形,有点意思,图形打印分为上下两半部分,即区间 [1,(n+1)/2][1,(n + 1) / 2][1,(n+1)/2][(n+1)/2,n][(n + 1) / 2,n][(n+1)/2,n]。对于每行的打印,可以进行分类讨论:

  • num1num1num1 为首先输出的 . 的个数
  • num1num1num1 为输出的 # 的个数
    • midmidmid 为 # 之间需要填充的 . 的个数
    • 若是其值大于 2,则需要使用 midmidmid 填充,num1num1num1 置为 2
  • num3num3num3 为最后输出的 . 的个数
#include <iostream>
using namespace std;
int main()
{int n;cin >> n;for(int i = 1;i <= n;i ++ ){if(i <= (n + 1) / 2){int num1 = (n + 1) / 2 - i;int num3 = num1;int num2 = n - num1 - num3;int mid = 0;if(num2 > 2){mid = num2 - 2;num2 = 2;}for(int j = 1;j <= num1;j ++ )cout << ".";if(num2 == 1)cout << "#";else {cout << "#";for(int j = 1;j <= mid;j ++ )cout << ".";cout << "#";}for(int j = 1;j <= num3;j ++ )cout << ".";cout << endl;}else {int num1 = i - (n + 1) / 2;int num3 = num1;int num2 = n - num1 - num3;int mid = 0;if(num2 > 2){mid = num2 - 2;num2 = 2;}for(int j = 1;j <= num1;j ++ )cout << ".";if(num2 == 1)cout << "#";else {cout << "#";for(int j = 1;j <= mid;j ++ )cout << ".";cout << "#";}for(int j = 1;j <= num3;j ++ )cout << ".";cout << endl; }}return 0;
}

三级

日历制作

好题,够恶心,解题思路:

  • 点开电脑的日历…就能看到每月的第一天是星期几
  • a 数组存储每月的第一天是星期几
  • b 数组存储每月有多少天,不用判断闰年,2025 是平年
  • 输入日历
    • 输出日历表头
    • 对空的天数进行输出
    • 根据 b 数组对应每月天数,结合 idx 进行换行、num 进行输出
#include <iostream>
using namespace std;
int main()
{int m;cin >> m;int a[13] = {0,3,6,6,2,4,7,2,5,1,3,6,1};int b[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};cout << "MON TUE WED THU FRI SAT SUN" << endl;int num = 1;for(int i = 1;i <= a[m] - 1;i ++ )printf("    ");int idx = a[m];while(num <= b[m]){if(idx > 7){cout << endl;idx = 1;}printf("%3d ",num);num ++ ;idx ++ ;}return 0;
}

数组清零

(水题)解题思路:

按要求模拟就行,别死循环

#include <iostream>
using namespace std;
const int N = 2e6 + 10;
int a[N];
int main()
{int n;cin >> n;for(int i = 1;i <= n;i ++ )cin >> a[i];int cnt = 0;while(1){int flag = 1;for(int i = 1;i <= n;i ++ ){if(a[i] != 0){flag = 0;break;}}if(flag)break;int maxidx = -1,minidx = -1;int maxnum = -0x3f3f3f3f,minnum = 0x3f3f3f3f;for(int i = 1;i <= n;i ++ ){if(a[i] >= maxnum){maxnum = a[i];maxidx = i;}if(a[i] < minnum && a[i] != 0){minnum = a[i];minidx = i;}}a[maxidx] -= a[minidx];cnt ++ ;}cout << cnt << endl;return 0;
}

四级

排兵布阵

(水题)解题思路:

老套的枚举子矩阵…用个函数封装操作就行

#include <iostream>
using namespace std;
const int N = 5050;
int a[N][N];
int judge(int x,int y,int dx,int dy)
{int cnt = 0;for(int i = x;i <= x + dx;i ++ ){for(int j = y;j <= y + dy;j ++ ){if(a[i][j] == 0)return -1;else cnt ++ ;}}return cnt;
}
int main()
{int n,m;cin >> n >> m;for(int i = 1;i <= n;i ++ ){for(int j = 1;j <= m;j ++ ){cin >> a[i][j];}}int ans = 0;for(int x = 1;x <= n;x ++ ){for(int y = 1;y <= m;y ++ ){for(int dx = 0;x + dx <= n;dx ++ ){for(int dy = 0;y + dy <= m;dy ++ ){ans = max(ans,judge(x,y,dx,dy));}}}}cout << ans << endl;return 0;
}

最长连续段

(水题)解题思路:

  • 对数组排序然后去重
  • 对遍历去重后的区间使用双指针即可
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2e6 + 10;
int a[N];
int main()
{int n;cin >> n;for(int i = 1;i <= n;i ++ )cin >> a[i];sort(a + 1,a + 1 + n);int tail = unique(a + 1,a + 1 + n) - a - 1;int ans = 0;for(int i = 1;i <= tail;i ++ ){int j = i + 1;while(j <= tail && a[j] - a[j - 1] == 1)j ++ ;ans = max(ans, j - i);i = j - 1;}cout << ans << endl;return 0;
}

五级

有趣的数字和

不错的题目:

我们发现,对于连续的四个数字,其中必定有两个奇数,两个偶数,因此我们可以把整个数轴按照区间长度为 4 来进行讨论,通过打表能够更直观的看到该规律,打表代码如下:

#include <iostream>
#define int long long
using namespace std;
signed main()
{int idx = 0;// 部分打表for(int i = 0;i <= 31;i ++ ){int t = i;int cnt = 0;while(t > 0){if(t & 1)cnt ++ ;t >>= 1;}idx ++ ;if(cnt & 1)cout << i << " " << "符合条件" << endl;else cout << i << endl;if(idx == 4){cout << endl;idx = 0;}}return 0;
}

打表结果:

0
1 符合条件
2 符合条件
34 符合条件
5
6
7 符合条件8 符合条件
9
10
11 符合条件12
13 符合条件
14 符合条件
1516 符合条件
17
18
19 符合条件20
21 符合条件
22 符合条件
2324
25 符合条件
26 符合条件
2728 符合条件
29
30
31 符合条件

对于每个长度为 4 的区间,我们可以对其离散化编号,将 lllrrr 的坐标 / 4 即可得到区间编号,我们把区间编号从 0 开始,那么第 nnn 个区间对应的范围也就是 [n×4,n×4+3][n × 4,n × 4 + 3][n×4,n×4+3]。在这里我们把 num1num1num1 即为 lll 所处的区间编号,num2num2num2 即为 rrr 所处的区间编号,对于每个合理的区间,我们来进行分类讨论:

  • 若是该区间完全被 [l,r][l,r][l,r] 覆盖,我们称之为全覆盖区间,合法区间范围为 [num1+1,num2−1][num1 + 1,num2 - 1][num1+1,num21],其有效计入答案值为两端数字之和 / 中间两个数字之和,由于两端数字之和 = 中间两个数字之和,**因此在这里,我们对全覆盖区间的有效答案求和就可以简单记为两端数字之和。**即:((i×4)+(i×4+3))((i × 4) + (i × 4 + 3))((i×4)+(i×4+3))
  • 对于没有被 [l,r][l,r][l,r] 全覆盖的区间,我们称之为半覆盖区间:
    • 若是 lll 所在的半覆盖区间和 r 所在的半覆盖区间属于同一区间,那么我们暴力枚举区间 [l,r][l,r][l,r] 即可
    • 若是 lllrrr 所在区间不同,我们需要对区间 [l,num1×4+3][l,num1 × 4 + 3][l,num1×4+3][num2×4,r][num2 × 4,r][num2×4,r] 进行暴力枚举
  • 最终答案即为全覆盖区间的有效答案 + 半覆盖区间的有效答案

由此,我们可以用 O(1)O(1)O(1) 时间复杂度来解决这个问题:

#include <iostream>
#define int long long
using namespace std;
signed main()
{int l,r;cin >> l >> r;int num1 = l / 4;int num2 = r / 4;int ans = 0;if(num1 == num2){for(int i = l;i <= r;i ++ ){int t = i;int cnt = 0;while(t > 0){if(t & 1)cnt ++ ;t /= 2;}if(cnt & 1)ans += i;}}else {for(int i = l;i <= num1 * 4 + 3;i ++ ){int t = i;int cnt = 0;while(t > 0){if(t & 1)cnt ++ ;t /= 2;}if(cnt & 1)ans += i;}for(int i = num2 * 4;i <= r;i ++ ){int t = i;int cnt = 0;while(t > 0){if(t & 1)cnt ++ ;t >>= 1;}if(cnt & 1)ans += i;}}for(int i = num1 + 1;i <= num2 - 1;i ++ ){ans += ((i * 4) + (i * 4 + 3));}cout << ans << endl;return 0;
}

数字选取

(水题)解题思路:

  • 1 肯定要作为答案加入
  • 奇质数要作为答案加入
  • 但凡 n≥2n \ge 2n2,证明一定存在 2 的幂次方,从 2 的幂次方中选取一个数作为答案加入
#include <iostream>
using namespace std;
const int N = 2e6 + 10;
// 埃氏筛法模板
int primes[N];
int st[N];
int idx = 0;
// 返回奇质数的个数
int get_primes(int n)
{for(int i = 2;i <= n;i ++ ){if(!st[i])primes[idx ++ ] = i;for(int j = i;j <= n;j += i)st[j] = true;}int cnt = 0;for(int i = 0;i < idx;i ++ ){if(primes[i] & 1)cnt ++ ;}return cnt;
}
int main()
{int n;cin >> n;int ans = 1 + get_primes(n);// 若是 n >= 2,则一定存在 2 的幂次方if(n >= 2)ans ++ ;cout << ans << endl;return 0;
}
http://www.dtcms.com/a/428526.html

相关文章:

  • 网站备案负责人幕布照图书馆理论与建设网站
  • Python原生数据结构深度解析:从入门到精通
  • 又拍网站怎么做的网站建设犀牛
  • 有什么网站建设软件有哪些找文网优化服务
  • 视频投票网站怎么做的网站建设分为哪几个步骤
  • 哪些网站做任务可以赚钱的wordpress菜单显示问题
  • 一周学习经验汇总之OpenSSH6 移植与库链接心得笔记
  • 游戏币网站建设wordpress虾米
  • 青岛易龙网站建设中国建筑招聘官方网站
  • 个人简历模板可编辑免费常州谷歌优化
  • 全屏网站大小企业网站建设中的常见问题
  • 湛江市微信网站建设企业app制作开发教程
  • Linux虚拟机固定IP超详细教程
  • 房产中介网站江门做网站软件
  • 合肥建站方案加强网站技术建设
  • 汽车零件销售网站开发影视制作公司简介
  • 做网站定金一般多少企业建设网站作用
  • 香港服务器租用价格大概是多少
  • 建网站投放广告赚钱电脑版淘宝网页
  • 网站建设推广多少钱服务周到的微网站建设
  • wordpress网站根目录28网站建设
  • 开关柜局放在线监测装置
  • MyBatis拦截器在服务内存防护场景中的应用
  • 东莞便宜做网站如何做一起好的视频宣传自己的网站
  • 【完整源码+数据集+部署教程】痤疮特征分割系统: yolov8-seg-p2
  • Python快速入门专业版(五十二): Python程序调试:print调试与pdb调试工具(定位代码错误)
  • 三大调度方案深度对比:AI/超算/大数据场景如何选?
  • 网站建设模板能实现按钮跳转吗河北省建设网站的网站首页
  • Linux-02(Linux用户和权限)
  • 网站建设数据库系统东台网站网站建设