蓝桥杯第九届c++大学B组详细

目录

1.第几天

2.明码

3.乘积尾零

4.测试次数

5.递增三元组

6.日志统计

7.乘积最大


1.第几天

 题目解析:这题是不是和以前有点印象,就是日期类但是是日期的减法。

#include <iostream>
using namespace std;class Date
{
public:    Date(int year, int month, int day):_year(year),_month(month),_day(day){if(!(year >= 0 && month >= 0 && month < 13 && day > 0 && day < getmonthday(year,day)))cout << "非法日期" << endl;}int getmonthday(int year, int month){int Month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int day = Month[month];if(month == 2 && (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))day++;return day;}bool operator>(const Date& d)const{if(_year > d._year)return true;else if(_year == d._year && _month > d._month)return true;else if(_year == d._year && _month == d._month && _day > d._day)return true;elsereturn false;}bool operator==(const Date& d)const{return _year == d._year &&_month == d._month &&_day == d.day;}bool operator<(const Date& d)const{return !(*this = d);}bool  operator>=(const Date& d)const{return *this > d || *this == d;}bool operator<=(const Date& d)const{return !(*this > d);}bool operator!=(const Date& d)const{return !(*this == d);}Date& operator+=(int day){if(day < 0)return *this -= -day;_day += day;while(_day > getmonthday(year, month)){day -= getmonthday(year, month);_month++;if(_month == 13){_month = 1;year++;}}return *this;}Date& operator+(int day) const{Date ret(*this);//拷贝构造ret += day;return ret;}Date& operator-=(int day) {if(day < 0)return *this += -day;_day = day;while(_day <= 0){_month--;if(_month == 0){_month = 12;_year--;}_day += getmonthday(_year, _month);}return *this;}Date operator-(int day) const{Date ret(*this);ret -= day;retuen ret;}Date& operator++(){*this += 1;return *this;}Date& operator++(int){Date& ret(*this);*this += 1;return ret;}Date& operator--(){*this -= 1;return *this;}Date& operator--(int){Date& ret(*this);*this -= 1;return ret;}int operator-(const Date& d) const[Date max = *this;Date min = d;int flag = 1;if(*this < d){max = d;min = *this;flag  = -1;}int count = 0;while(min != max){++min;++count;}return count * flag;]private:int  _year;int  _month;int  _day;
};int main()
{Date d1(2000, 1, 1);Date d2(2000, 5, 4);int count = d2 - d1;cout << count << endl;return 0;
}

2.明码

 题目解析:看清题目,其实就是进制转换。再将数据是2个字节一起处理是16点阵。

#include <iostream>
#include<bitset>
#include<string>
using namespace std;int main()
{int n, m;int len;string tmp;//因为是16个点阵一个字节8个信息,那么一次就需要两个字节。while(cin >> n >> m){bitset<8> t;t = n;tmp = t.to_string();len = tmp.size();for(int i = 0; i < len; i++){if(tmp[i] == '0')cout << " ";elsecout << "*";}t = m;tmp = t.to_string();len = tmp.size();for(int i = 0; i < len; i++){if(tmp[i] == '0')cout << " ";elsecout << "*";}cout << endl;}return 0;
}

3.乘积尾零

 题目解析:如果直接暴力那么绝对会超出范围,可以这么想。看下面的规律

2*5 = 10; 2*1*5*1 = 10      一个2一个5就是一个0

4*25 = 100  2*2*5*5=100

8*125 = 2*2*2*5*5*5 = 1000;

本质就会转化为求取2和5的对数。

int main()
{int num[10*10] ={ 5650, 4542, 3554, 473, 946, 4114, 3871, 9073, 90, 4329,2758, 7949, 6113, 5659, 5245, 7432, 3051, 4434, 6704, 3594,9937, 1173, 6866, 3397, 4759, 7557, 3070, 2287, 1453, 9899,1486, 5722, 3135, 1170, 4014, 5510, 5120, 729, 2880, 9019,2049, 698, 4582, 4346, 4427, 646, 9742, 7340, 1230, 7683,5693, 7015, 6887, 7381, 4172, 4341, 2909, 2027, 7355, 5649,6701, 6645, 1671, 5978, 2704, 9926, 295, 3125, 3878, 6785,2066, 4247, 4800, 1578, 6652, 4616, 1113, 6205, 3264, 2915,3966, 5291, 2904, 1285, 2193, 1428, 2265, 8730, 9436, 7074,689, 5510, 8243, 6114, 337, 4096, 8199, 7313, 3685, 211};int count_2 = 0, count_5 = 0;for (int i = 0; i < sizeof(num) / sizeof(int); i++){int tmp = num[i];while (tmp % 2 == 0){count_2++;}while (tmp % 5 == 0){count_5++;}}cout << min(count_2,count_5) << endl;return 0;
}

4.测试次数

题目解析:本质是动态规划,dp[i][j]表示i个手机在j层的运气最坏的测试数。如果在第k层手机摔坏,那么就要到下一层进行测试一次,没摔坏就是要到上一层进行测试。状态转移方程就是dp[j][i] = min(dp[j][i],max(dp[j-1][k-1], dp[j][j-k])+1);最后返回dp[3][1000]就是答案。

#include <iostream>
#include<climits>
using namespace std;
//dp[i][j]表示i个手机在j层的运气最坏的测试数。
int dp[5][1007];int main()
{for(int i = 1; i <= 3;i++){for(int j = 1; j <= 1000; j++){dp[i][j] = j;}}//楼层数for(int i = 1; i <= 1000; i++){//手机数for(int j = 2; j <= 3; j++){//从摔坏楼层开始走。for(int k = 1; k < i; k++){dp[j][i] = min(dp[j][i], max(dp[j-1][k-1], dp[j][i - k]) + 1);}}}cout << dp[3][1000] << endl;return 0;
}

5.递增三元组

题目解析:先将数组进行排序,使得它们变得有序,然后就是利用两个指针进行将a,c数组找到第一个小于b数组的个数,然后将个数相乘就会得到排序的个数。

#include <iostream>
#include<algorithm>
using namespace std;#define N 100010
int n;
int a[N], b[N], c[N];
long long ret = 0;
int main()
{cin >> n;for(int i = 1; i <= n; i++){cin >> a[i];}for(int i = 1; i <= n; i++){cin >> b[i];}for(int i = 1; i <= n; i++){cin >> c[i];}//排序;sort(a + 1, a + n + 1);sort(b + 1, b + n + 1); sort(c + 1, c + n + 1);int j = 1;int k = 1;for(int i = 1; i <= n; i++){while(j <= n && a[j] < b[i]) j++;//找到第一个数组种第一次大于第二个数组的数;while(k <= n && c[k] <= b[i]) k++;//找到第三个数组种第一次大于第二个数组的数;ret += (long long) (j - 1) * (n - k + 1);}cout << ret << endl;return 0;
}

6.日志统计

 题目解析:这个题目就是依葫芦画瓢。看代码哦。

#include <iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
using namespace std;int N, D, K;struct log
{int id, ts;
};bool cmp(log a, log b)
{return a.ts < b.ts;
}int main()
{cin >> N >> D >> K;vector<log> logs(N);for(int i = 0; i < N; i++){cin >> logs[i].ts >> logs[i].id;}sort(logs.begin(), logs.end(), cmp);//记录答案set<int> ans;//id出现次数map<int, int> cnt;int j = 0;for(int i = 0; i < N; i++){//时间间隔不大于D.while(j < N && logs[j].ts - logs[i].ts < D){cnt[logs[j].id]++;//出现次数++//并且id数>=k,就记录一下答案。if(cnt[logs[j].id] >= K) ans.insert(logs[j].id);j++;}cnt[logs[i].id]--;}      for(set<int>::iterator i = ans.begin(); i != ans.end(); i++)cout << *i << endl;return 0;
}

7.乘积最大

 题目解析:本题目就是分类讨论,首先将数组元素进行排序,可以分为三种情况,第一就是全选k == n; 那么就直接选择相乘,然后就是其中进行挑选。k < n;也分两种;一种挑选的k为偶数,一种挑选k为奇数。再在这两种情况当中分负数的有全部,以及部分分为偶数个和奇数个,还有全部是正数的。这样就可以编写了。

#include <iostream>
#include<algorithm>
using namespace std;
#define MOD 1000000009;const int N = 100010;
long long int a[N];
int main()
{int n, k;cin >> n >> k;int flag = 0;//统计负数for(int i = 0; i < n; i++){cin >> a[i];if(a[i] < 0)flag++;}sort(a, a + n);long long int ans = 1;//记录乘积答案//全部是负数并且k为奇数if(k % 2 != 0 && flag == n){for(int i = 0; i < k; i++){ans = ans * a[n - 1 - i] % MOD;ans = ans % MOD;}cout << ans << endl;return 0;}//奇数选择】最大的先;if(k % 2 != 0){ans = a[n - 1];n--;k--;}int t = 0;int left = 0, right = n - 1;//左右两边进行选择;while(t < k){if(a[left] * a[left + 1] >= a[right] * a[right - 1]){long long tmp = a[left] * a[left + 1] % MOD;ans = ans * tmp % MOD;ans = ans % MOD;left += 2;t += 2;}else{long long tmp = a[right] * a[right - 1] % MOD;ans = ans * tmp % MOD;ans = ans % MOD;right -= 2;t += 2;}}cout << ans << endl;return 0;
}

蓝桥杯冲冲冲,加油xdm。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/586240.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红酒:红酒的分类标准与市场细分

红酒的分类标准与市场细分是红酒产业中非常重要的概念。通过对红酒进行分类&#xff0c;可以更好地满足不同消费者的需求&#xff0c;提升红酒的市场份额和品牌影响力。 首先&#xff0c;红酒的分类标准可以根据不同的维度进行划分。常见的分类标准是根据葡萄酒的口感、香气、颜…

新生儿吃手指:家长应该知道的注意事项

引言&#xff1a; 新生儿吃手指是一个常见的现象&#xff0c;但对于许多父母来说&#xff0c;这可能会引起一些担忧和困惑。在本文中&#xff0c;我们将探讨新生儿吃手指的一些常见原因、可能的影响以及家长应该采取的注意事项&#xff0c;帮助父母更好地理解和应对这种行为。 …

motor,一个好用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - motor。 Github地址&#xff1a;https://github.com/mongodb/motor 在现代的软件开发中&#xff0c;异步编程已经成为了不可或缺的一部分。特别是在处…

中国主要河流水系数据

在我国&#xff0c;水系等级划分主要依据流域面积、流量和河流长度等因素。根据《中华人民共和国水资源》的相关规定&#xff0c;我国水系等级大致可以分为以下几类&#xff1a; 一级水系&#xff1a;主要是指国内的大型河流&#xff0c;如长江、黄河、珠江等。这些河流的流域…

第14届蓝桥杯C++B组省赛:串的熵|枚举、浮点数相等比较、log函数

题目链接&#xff1a; 2.01串的熵 - 蓝桥云课 (lanqiao.cn) 注意点&#xff1a; 1.C的log函数&#xff1a;有2&#xff0c;e&#xff08;log()以e为底&#xff09;&#xff0c;10为底的&#xff0c;没有现成的用换底公式&#xff1a; C 标准库 <cmath> 数学函数大全 - …

Mybatis-自定义映射ResultMap用法

文章目录 一、处理属性名与字段名不同问题1.通过设置查询别名&#xff0c;使类属性名与字段名&#xff08;数据库内的名&#xff09;一致2.设置全局配置&#xff0c;使下划线自动映射为驼峰3.ResultMap 二、处理多对一映射问题前提背景1.使用级联来实现2.association 标签实现3…

探索数据库-------MYSQL故障排除与优化

目录 mysql逻辑架构图 一、MySQL 数据库故障 1.1 MySQL 单实例故障排查 1.1.1故障现象 1 1.1.2故障现象 2 1.1.3故障现象 3 1.1.4故障现象 4 1.1.5故障现象 5 1.1.6故障现象 6 1.1.7故障现象 7 1.1.8故障现象 8 1.2MySQL 主从故障排查 1.2.1故障现象 1 1.2.2故障…

SSM框架学习——Spring事务管理

Spring事务管理 概念 事务&#xff08;Transaction&#xff09;是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行&#xff0c;要么都不执行&#xff0c;是一个不可分割的工作单元。 事务有如下特性&#xff1a; 原子性隔离性一致性持久性 …

789. 数的范围 (二分学习)

1.确定一个区间&#xff0c;使得目标值一定在区间中 2.找一个性质满足&#xff1a; &#xff08;1&#xff09;性质具有二段性 &#xff08;2&#xff09;答案是二段性的分界点 3.整数二分&#xff08;处理红色右端点和绿色左端点&#xff09; //代码1&#xff1a;右端点 int…

搜索与图论——Prim算法求最小生成树

在最小生成树问题里&#xff0c;正边和负边都没问题 朴素版prim算法 时间复杂度O(n^2) 生成树&#xff1a;每一次选中的t点&#xff0c;它和集合的距离对应的那条边&#xff0c;就是生成树的一条边 算法流程和dijkstra算法非常相似 #include<iostream> #include<cs…

算法——矩阵,被围绕的区域

. - 力扣&#xff08;LeetCode&#xff09; 最开始也是考虑使用dfs&#xff0c;对于矩阵中的每个点&#xff0c;如果能到达边界的O&#xff0c;则跳过继续dfs。否则如果上下左右四个方向都无法到达边界的O&#xff0c;则说明当前的无法到达&#xff0c;在一个set中记录他的行数…

LLMs 可能在 2 年内彻底改变金融行业

在艾伦图灵研究所&#xff08;The Alan Turing Institute&#xff09;最新的一项研究中&#xff0c;我们看到了大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的一种可能性。它有望通过检测欺诈行为、生成财务洞察以及自动化客户服务&#xff0c;…