当前位置:   article > 正文

第十五(15)届蓝桥杯模拟赛题解+AC代码(第一期)_第十五届蓝桥杯校模拟赛python第一期题目

第十五届蓝桥杯校模拟赛python第一期题目

励志短句:纵使长夜难明,亦会有人为你燃灯

提醒:篇幅较长,大家可以结合目录查看想要的内容

第一题:

题面:

3733e7339fd5492b913b79ab0dcff719.png

思路:

1.从2023开始枚举每一个数并检查是否合法,一但枚举到合法的数,直接输出答案结束程序即可

2.怎么检查一个数是否合法呢?可以直接转化16进制后放到数组中,再遍历数组判断是否有小于10的数,没有的话就是合法的,有一个数小于10就是不满足条件的,直接返回false

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=2e5+7;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int n,m;
  26. int a[N];
  27. bool check(int x,vector<int> &nums){
  28. while(x) {
  29. nums.push_back(x%16);
  30. x/=16;
  31. }
  32. for(int i=0;i<nums.size();i++)
  33. if(nums[i]<10) return false;
  34. return true;
  35. }
  36. void solve(){
  37. for(int i=2023;;i++){
  38. vector<int>nums;
  39. if(check(i,nums)){
  40. cout<<i<<"\n";
  41. return;
  42. }
  43. }
  44. }
  45. void init(){
  46. }
  47. int main()
  48. {
  49. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  50. T=1;
  51. //cin>>T;
  52. //scanf("%d",&T);
  53. init();
  54. while(T--){
  55. solve();
  56. }
  57. return 0;
  58. }

注意这题是直接输出答案:2730

但是这里还是贴上一个代码

第二题:

题面:

e3683e361a4d466daa289126fcb6e2ff.png

思路:

1.一个字母时为A~Z,有26个字母,两个字母时AA~ZZ,共有26*26=676,当有三个字母时AAA~ZZZ,共有26*26*26=17576个字母,因为2022在[676,17576]之间,故2022一定是有三个字母的。

2.此时可以用3个for循环,3个for循环依次对应第几位填那个字母,从A到Z枚举,并用一个计数器记录枚举到了那个数字,枚举到了2022就直接输出答案

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. int const mod=998244353; //1e9+7
  14. int const N=2e5+7;
  15. int const INF=0x3f3f3f3f;
  16. typedef long long LL;
  17. typedef pair<int,int>PII;
  18. #define x first
  19. #define y second
  20. #define ls u<<1
  21. #define rs u<<1|1
  22. int T;
  23. int n,m;
  24. int a[N];
  25. LL ans;
  26. void solve()
  27. {
  28. int cnt=26*26+26; //1个字符,2个字符的所有组合情况
  29. for(char i='A';i<='Z';i++)
  30. for(char j='A';j<='Z';j++)
  31. for(char k='A';k<='Z';k++){
  32. cnt++;
  33. if(cnt==2022){ //到了2022直接输出答案
  34. cout<<i<<" "<<j<<" "<<k<<" ";
  35. return;
  36. }
  37. }
  38. }
  39. int main()
  40. {
  41. T=1;
  42. // scanf("%d",&T);
  43. while(T--){
  44. ans=0;
  45. solve();
  46. }
  47. return 0;
  48. }

注意这题是直接输出答案:BYT

但是这里还是贴上一个代码

第三题:

题面:

1e0661519f3c456f907769535ef62337.png

思路:

1.关于日期的问题,这里有一个通解,难就难在check函数,就是给你一个8位数的十进制数,如何判断它是一个合法的日期

2.这里可以按年,月,日,拆出来,可以直接让前4位数为年份,第5 6位为月份,最后两位数为日,然后特判月份与日为0的情况,还有月份大于12的情况,最后根据月份直接判断日期是否合法就行,但是还要注意一个平闰年的情况(闰年29天,平年28天,判断闰年的方法是:能被400整除一定为闰年,还有能被4整除但是不能被100整除一定是闰年)

3.关于本题:可以直接从19000101枚举到99991231,在用check函数判断每一个数是否为合法日期,是合法日期答案++。(check函数具体细节看代码)

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. int const mod=998244353; //1e9+7
  14. int const N=2e5+7;
  15. int const INF=0x3f3f3f3f;
  16. typedef long long LL;
  17. typedef pair<int,int>PII;
  18. #define x first
  19. #define y second
  20. #define ls u<<1
  21. #define rs u<<1|1
  22. int T;
  23. int n,m;
  24. int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  25. bool check(int data){
  26. int year=data/10000;
  27. int month=data/100%100;
  28. int day=data%100;
  29. if(month==0||month>12||day>31||day==0) return false;
  30. if(month==2){
  31. bool flag=year%400==0||(year%4==0&&year%100!=0);
  32. if(day>flag+28) return false;
  33. }
  34. else if(day>months[month]) return false;
  35. //上面这段代码,可以背过,
  36. //以后遇到关于日期的问题,可以直接当公式套用
  37. //检查年份数位和是否等于月+日的数位和
  38. int temp=year;
  39. int a=0,b=month%10+month/10%10+day/10%10+day%10;
  40. while(temp) a+=temp%10,temp/=10;
  41. if(a!=b) return false; //年份数位和不等于月+日的数位和
  42. return true; //上面条件都满足才返回true
  43. }
  44. void solve()
  45. {
  46. int ans=0;
  47. for(int i=19000101;i<=99991231;i++)
  48. if(check(i)) ans++;
  49. cout<<ans<<endl;
  50. }
  51. int main()
  52. {
  53. T=1;
  54. // scanf("%d",&T);
  55. while(T--){
  56. //ans=0;
  57. solve();
  58. }
  59. return 0;
  60. }

注意这题是直接输出答案:70910

但是这里还是贴上一个代码

第四题:

题面:

790bf55ca7744b68aa14970f3003d320.png

intput:

99 22 51 63 72 61 20 88 40 21 63 30 11 18 99 12 93 16 7 53 64 9 28 84 34 96 52 82 51 77

思路:

1.可以直接两重for循环枚举两个数,第一个for枚举第一个数,第二个for枚举第二个数,满足乘积大于等于2022答案++

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. int const mod=998244353; //1e9+7
  14. int const N=2e5+7;
  15. int const INF=0x3f3f3f3f;
  16. typedef long long LL;
  17. typedef pair<int,int>PII;
  18. #define x first
  19. #define y second
  20. #define ls u<<1
  21. #define rs u<<1|1
  22. int T;
  23. int n,m;
  24. int a[N];
  25. LL ans;
  26. void solve()
  27. {
  28. n=30;
  29. for(int i=0;i<n;i++) scanf("%d, ",&a[i]);
  30. for(int i=0;i<n;i++)
  31. for(int j=i+1;j<n;j++)
  32. if(a[i]*a[j]>=2022) ans++;
  33. cout<<ans<<endl;
  34. }
  35. int main()
  36. {
  37. T=1;
  38. // scanf("%d",&T);
  39. while(T--){
  40. ans=0;
  41. solve();
  42. }
  43. return 0;
  44. }

注意这题是直接输出答案:189

但是这里还是贴上一个代码

第五题:

题面:

aa946cef42b642c28a10ae688e93fa5e.png63e1d3c10f834834b07314f5a650d315.png

input:

  1. 110010000011111110101001001001101010111011011011101001111110
  2. 010000000001010001101100000010010110001111100010101100011110
  3. 001011101000100011111111111010000010010101010111001000010100
  4. 101100001101011101101011011001000110111111010000000110110000
  5. 010101100100010000111000100111100110001110111101010011001011
  6. 010011011010011110111101111001001001010111110001101000100011
  7. 101001011000110100001101011000000110110110100100110111101011
  8. 101111000000101000111001100010110000100110001001000101011001
  9. 001110111010001011110000001111100001010101001110011010101110
  10. 001010101000110001011111001010111111100110000011011111101010
  11. 011111100011001110100101001011110011000101011000100111001011
  12. 011010001101011110011011111010111110010100101000110111010110
  13. 001110000111100100101110001011101010001100010111110111011011
  14. 111100001000001100010110101100111001001111100100110000001101
  15. 001110010000000111011110000011000010101000111000000110101101
  16. 100100011101011111001101001010011111110010111101000010000111
  17. 110010100110101100001101111101010011000110101100000110001010
  18. 110101101100001110000100010001001010100010110100100001000011
  19. 100100000100001101010101001101000101101000000101111110001010
  20. 101101011010101000111110110000110100000010011111111100110010
  21. 101111000100000100011000010001011111001010010001010110001010
  22. 001010001110101010000100010011101001010101101101010111100101
  23. 001111110000101100010111111100000100101010000001011101100001
  24. 101011110010000010010110000100001010011111100011011000110010
  25. 011110010100011101100101111101000001011100001011010001110011
  26. 000101000101000010010010110111000010101111001101100110011100
  27. 100011100110011111000110011001111100001110110111001001000111
  28. 111011000110001000110111011001011110010010010110101000011111
  29. 011110011110110110011011001011010000100100101010110000010011
  30. 010011110011100101010101111010001001001111101111101110011101

思路:

1.连通块问题,可以直接bfs,dfs都可以解决,具体细节看代码

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. int const mod=998244353; //1e9+7
  14. int const N=37,M=67;
  15. int const INF=0x3f3f3f3f;
  16. typedef long long LL;
  17. typedef pair<int,int>PII;
  18. #define x first
  19. #define y second
  20. #define ls u<<1
  21. #define rs u<<1|1
  22. int T;
  23. int n,m;
  24. char s[N][M];
  25. int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
  26. int dfs(int x,int y){
  27. int res=1;
  28. for(int i=0;i<4;i++){
  29. int bx=dx[i]+x,by=dy[i]+y;
  30. if(bx<0||by<0||bx>=n||by>=m) continue;
  31. if(s[bx][by]!='1') continue;
  32. s[bx][by]='2'; //遍历过改为字符2
  33. res+=dfs(bx,by);
  34. }
  35. return res;
  36. }
  37. int bfs(int x,int y){
  38. queue<PII>q;
  39. q.push({x,y});
  40. int res=0;
  41. while(q.size()){
  42. PII temp=q.front(); q.pop();
  43. res++; //联通个数++
  44. for(int i=0;i<4;i++){
  45. int bx=dx[i]+temp.x,by=dy[i]+temp.y;
  46. if(bx<0||by<0||bx>=n||by>=m) continue;
  47. if(s[bx][by]!='1') continue;
  48. s[bx][by]='2'; //遍历过改为字符2
  49. q.push({bx,by});
  50. }
  51. }
  52. return res;
  53. }
  54. void solve()
  55. {
  56. n=30,m=60;
  57. for(int i=0;i<n;i++) scanf("%s",s[i]);
  58. int ans=0;
  59. for(int i=0;i<n;i++)
  60. for(int j=0;j<m;j++){
  61. if(s[i][j]=='1'){
  62. //记得起点也要更改,此语句是后面加上的,
  63. //149并非正确答案,正确答案为148
  64. s[i][j]='2';
  65. ans=max(ans,dfs(i,j)); //dfs
  66. //ans=max(ans,bfs(i,j)); //bfs
  67. }
  68. }
  69. cout<<ans<<endl;
  70. }
  71. int main()
  72. {
  73. T=1;
  74. // scanf("%d",&T);
  75. while(T--){
  76. //ans=0;
  77. solve();
  78. }
  79. return 0;
  80. }

注意这题是直接输出答案:148

但是这里还是贴上一个代码

第六题:

题面:

e5f9c977577848729addc6aede3ab32a.png

思路:

简述题意:给你一周中的一天w,问过了n天后是星期几?

1.过了n天后是第几天,n为7的倍数不影响答案,故可以直接对n取模,再累加到w中

2.注意这里取模ans可能等于0的情况,此时要更改ans=7

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=2e5+7;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int w,n,m;
  26. int a[N];
  27. void solve(){
  28. cin>>w>>n;
  29. int ans=(w+n%7)%7;
  30. if(ans==0) ans=7;
  31. cout<<ans<<endl;
  32. }
  33. void init(){
  34. }
  35. int main()
  36. {
  37. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  38. T=1;
  39. //cin>>T;
  40. //scanf("%d",&T);
  41. init();
  42. while(T--){
  43. solve();
  44. }
  45. return 0;
  46. }

第七题:

题面:

c8f03cbb64b34d85b7489e5224e0872b.png

7afb52c61c2046f0a689e4ca8a16765d.png

思路:

简述题意:给定一个矩形区域,和n个半径为R的圆心,问矩形中有多少个点被圆所包含?

1.数据范围较小,可以直接枚举每个点,看是否被某个圆所包含,包含直接答案++

时间复杂度 o(WHn) 1e6

AC_Code:

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=107;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int W,H,n,R;
  26. PII a[N];
  27. void solve(){
  28. scanf("%d%d%d%d",&W,&H,&n,&R);
  29. for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
  30. int ans=0;
  31. for(int i=0;i<=W;i++)
  32. for(int j=0;j<=H;j++){
  33. for(int k=0;k<n;k++){
  34. //点到圆心的距离
  35. double dist=(i-a[k].x)*(i-a[k].x)+(j-a[k].y)*(j-a[k].y);
  36. if(dist<=R*R){ //圆心的半径更大,那么当前点一定再圆内
  37. ans++; //等于的话就是再圆上
  38. break;
  39. }
  40. }
  41. }
  42. cout<<ans<<endl;
  43. }
  44. void init(){
  45. }
  46. int main()
  47. {
  48. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  49. T=1;
  50. //cin>>T;
  51. //scanf("%d",&T);
  52. init();
  53. while(T--){
  54. solve();
  55. }
  56. return 0;
  57. }

第八题:

题面:

8b01478cfdc646f5a0453efe4c37099c.png

cc965bb0e5d943e380899af4bd476d3d.png

思路:

1.对于每一次清理次数,可以直接遍历矩阵进行标记代表被清理过,最后统计没有被标记的格子数即可

2.如果数据范围大一点的话,可以考虑差分写,

时间复杂度 o(n*m*q) 最坏跑1e6

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=107;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int n,m;
  26. int a[N];
  27. int vis[N][N]; //标记当前格子是否被清理过
  28. void solve(){
  29. scanf("%d%d",&n,&m);
  30. int q; scanf("%d",&q);
  31. while(q--){
  32. int x1,y1,x2,y2;
  33. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  34. for(int i=x1;i<=x2;i++)
  35. for(int j=y1;j<=y2;j++)
  36. vis[i][j]=1; //被清理过就标记为1
  37. }
  38. int ans=0;
  39. for(int i=1;i<=n;i++)
  40. for(int j=1;j<=m;j++)
  41. if(!vis[i][j]) ans++;
  42. cout<<ans<<endl;
  43. }
  44. void init(){
  45. }
  46. int main()
  47. {
  48. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  49. T=1;
  50. //cin>>T;
  51. //scanf("%d",&T);
  52. init();
  53. while(T--){
  54. solve();
  55. }
  56. return 0;
  57. }

第九题:

题面:

cb0f8dc6fac746998403a8ca77f82e48.png

02f0142db09742d2ba533b309cd0da64.png

思路1:朴素dfs

1.数据范围较小,可以直接dfs求答案

2.但是矩阵呈回子型,或者呈s型递增递减,最坏情况时间复杂度为o(n^4),这里就可能会超时

TLE_Code:C++(这里可能会超时,最坏1e8)

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=307;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int n,m;
  26. int a[N][N];
  27. int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
  28. int dfs(int x,int y){
  29. int res=1;
  30. for(int i=0;i<4;i++){
  31. int bx=dx[i]+x,by=dy[i]+y;
  32. if(bx<1||by<1||bx>n||by>m) continue; //没有出界
  33. if(a[x][y]>a[bx][by]) //当前值更大,就递归下一个坐标
  34. res=max(res,dfs(bx,by)+1);
  35. }
  36. return res;
  37. }
  38. void solve(){
  39. scanf("%d%d",&n,&m);
  40. for(int i=1;i<=n;i++)
  41. for(int j=1;j<=m;j++)
  42. scanf("%d",&a[i][j]);
  43. //这里直接对每一个点dfs一遍,求最大值
  44. int ans=1;
  45. for(int i=1;i<=n;i++)
  46. for(int j=1;j<=m;j++){
  47. ans=max(ans,dfs(i,j));
  48. }
  49. cout<<ans<<endl;
  50. }
  51. void init(){
  52. }
  53. int main()
  54. {
  55. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  56. T=1;
  57. //cin>>T;
  58. //scanf("%d",&T);
  59. init();
  60. while(T--){
  61. solve();
  62. }
  63. return 0;
  64. }

思路2:记忆化搜索

1.可以再第一步的基础上,加上一个数组,记录答案,优化搜索次数,此时的时间复杂度会将为o(n^2)

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=307;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int n,m;
  26. int a[N][N];
  27. int f[N][N];
  28. int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
  29. int dfs(int x,int y){
  30. int &res=f[x][y]; //用的引用,直接记录答案
  31. if(res!=-1) return res; //记忆化·
  32. res=1; //包括本身这个数
  33. for(int i=0;i<4;i++){
  34. int bx=dx[i]+x,by=dy[i]+y;
  35. if(bx<1||by<1||bx>n||by>m) continue;
  36. if(a[x][y]>a[bx][by])
  37. res=max(res,dfs(bx,by)+1);
  38. }
  39. return res;
  40. }
  41. void solve(){
  42. scanf("%d%d",&n,&m);
  43. for(int i=1;i<=n;i++)
  44. for(int j=1;j<=m;j++)
  45. scanf("%d",&a[i][j]);
  46. memset(f,-1,sizeof f); //初始化为-1
  47. int ans=1;
  48. for(int i=1;i<=n;i++)
  49. for(int j=1;j<=m;j++){
  50. ans=max(ans,dfs(i,j));
  51. }
  52. cout<<ans<<endl;
  53. }
  54. void init(){
  55. }
  56. int main()
  57. {
  58. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  59. T=1;
  60. //cin>>T;
  61. //scanf("%d",&T);
  62. init();
  63. while(T--){
  64. solve();
  65. }
  66. return 0;
  67. }

第十题:

题面:

8abcb143ae404dc499f8db9471cd1330.png

b4f536e2a426465199bfe1f3a755555e.png

思路:线段树

1.对每一个下标索引i,枚举一遍区间[i-k,i+k],时间复杂度是会超时的,故考虑优化

2.题目是区间查询最小值,很容易想到线段树,对每一个数区间查询最小值即可,这题算是线段树的最基本操作,大家务必掌握哈,

时间复杂度:o(nlogn)

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=1e6+7;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int n,m,k;
  26. int w[N];
  27. struct Node{
  28. int l,r,val;
  29. }tr[N<<2];
  30. void build(int u,int l,int r){
  31. if(l==r) tr[u]={l,r,w[r]};
  32. else{
  33. tr[u].l=l; tr[u].r=r; //记录区间
  34. int mid=(l+r)>>1;
  35. build(ls,l,mid); build(rs,mid+1,r);
  36. tr[u].val=min(tr[ls].val,tr[rs].val);
  37. }
  38. }
  39. int query(int u,int l,int r){
  40. if(l<=tr[u].l&&tr[u].r<=r) return tr[u].val;
  41. int res=1e9; //为了不影响答案更新,取一个INF
  42. int mid=(tr[u].l+tr[u].r)>>1;
  43. if(mid>=l) res=query(ls,l,r);
  44. if(r>mid) res=min(res,query(rs,l,r));
  45. return res;
  46. }
  47. void solve(){
  48. scanf("%d", &n);
  49. for(int i=1;i<=n;i++) scanf("%d",w+i);
  50. build(1,1,n); //建树
  51. scanf("%d",&k);
  52. for(int i=1;i<=n;i++){ //对每个区间直接查询最小值
  53. //这里要注意查询的区间,不然容易tle
  54. int l=max(1,i-k),r=min(n,i+k); //左右区间
  55. printf("%d ",query(1,l,r));
  56. }
  57. }
  58. void init(){
  59. }
  60. int main()
  61. {
  62. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  63. T=1;
  64. //cin>>T;
  65. //scanf("%d",&T);
  66. init();
  67. while(T--){
  68. solve();
  69. }
  70. return 0;
  71. }

第十一题:

题面:

e7f99e25bb8e463e8c669c6641042ffa.png

90d83f6bbfcd4b55a028a310e8d976c3.png

思路:

1.直接模拟,大于1就折半(除2),并记录除2的次数

很奇怪,竟然不止10题,但是这题较为简单

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=2e5+7;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int n,m;
  26. int a[N];
  27. void solve(){
  28. double n; cin>>n;
  29. int ans=0;
  30. while(n>1) ans++,n/=2;
  31. cout<<ans<<endl;
  32. }
  33. void init(){
  34. }
  35. int main()
  36. {
  37. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  38. T=1;
  39. //cin>>T;
  40. //scanf("%d",&T);
  41. init();
  42. while(T--){
  43. solve();
  44. }
  45. return 0;
  46. }

第十二题:

题面:

65d3baf75fd745509a76642f302be541.png

思路:单调栈

1.字典序最小最大问题,可以用单调栈解决

2.本题是删除k个字符使字典序最小,遍历字符串,维护一个单调不下降栈,若当前遍历的字符比栈顶元素更小则弹出栈顶元素,代表删除了一个字符,直到删除到k个字符(具体细节看代码)

3.如果到最后都没有删除k个字符,则从单调不下降栈中的栈顶位置开始删除,直到删除到k个字符,最后直接输出栈中元素就是答案

本题为最后一题,加油把这些题都给Ac了

AC_Code:C++

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <queue>
  6. #include<stack>
  7. #include<cmath>
  8. #include <unordered_set>
  9. #include <unordered_map>
  10. #include<set>
  11. #include <map>
  12. using namespace std;
  13. typedef long long LL;
  14. typedef pair<int,int>PII;
  15. #define x first
  16. #define y second
  17. #define ls u<<1
  18. #define rs u<<1|1
  19. #define all(ss) ss.begin(),ss.end()
  20. int const mod1=998244353;
  21. int const mod2=1e9+7;
  22. int const N=2e5+7;
  23. int const INF=0x3f3f3f3f;
  24. int T;
  25. int n,m;
  26. int a[N];
  27. string s;
  28. //再字符串s中,删除k个字符,是字典序最小
  29. string get(string s,int k){
  30. string st; //这里用string模拟栈
  31. for(int i=0;i<n;i++){
  32. while(st.size()&&s[i]<st.back()&&k){
  33. st.pop_back(); //弹出栈顶元素
  34. k--; //删除字符--
  35. }
  36. st.push_back(s[i]);
  37. }
  38. while(k--) st.pop_back(); //没有删除k个字符,则从栈顶往前删除
  39. return st;
  40. }
  41. void solve(){
  42. cin>>n>>m>>s;
  43. cout<<get(s,m);
  44. }
  45. void init(){
  46. }
  47. int main()
  48. {
  49. //std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  50. T=1;
  51. //cin>>T;
  52. //scanf("%d",&T);
  53. init();
  54. while(T--){
  55. solve();
  56. }
  57. return 0;
  58. }

苏格拉底曾说,世界上最快乐的事,莫过于为了梦想而奋斗

欢迎大家关注,点赞,收藏。

如有问题,欢迎大家指正

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/440962
推荐阅读
相关标签
  

闽ICP备14008679号