挑战杯刷题

字符串相关

字符串相关:

插入元素:
str.insert(pos,num,string);//pos是待查入的位置,num是插入几次,string是待插入的字符串
str.insert(pos,string);//与上面insert一样,不过只在pos位置插入string一次
查找指定字符串在原始字符串中的位置
int pos = str.find(target);//反会target字符串,在str中的起始位置
删除某一区间的字符串
str.erase(pos,num);//删除str字符串中,从pos位置为起点,num个长度的元素
获取字符串长度
int len = str.length();
int len = str,size();

ASCII码相关
A-Z 65-90
a-z 97-122


在这里插入图片描述

思路:
主要考察对C++字符串的操作

#include<bits/stdc++.h>
#include<string>
#include<iostream>
using namespace std;



int main()
{
  string s;
  cin>>s;

  int n;
  char ch;
  cin>>n;
  cin>>ch;

  while(n>0)
  {
    int i,j;
    cin>>i;
    cin>>j;

    int len = s.length();
    bool flag=false;
    int pos = 0;
    for(int k = i-1;k<j;k++)
    {
      if(s[k]==ch)
      {
        pos = k;
        flag = true;
        break;
      }
    }
    if(flag==true)
    {
     s.erase(pos,1);
    }
    else
    {
      string temp = "";
      temp+=ch;
      s = s.insert(j,temp);
    }

    n--;
  }
 cout<<s<<endl;
  return 0;
}

题目描述:
有一组均由字符AZ和az组成的字符串,其中要求将字符串中各字符按如下要求进行转换:
A<->z、B<->y、C<->x、… 、X<->c、Y<->b、Z<->a。
输入样例:Algorithm
输出样例:zOTLIRGSN

#include<bits/stdc++.h>

using namespace std;

int main()
{
string str;
cin>>str;
for(auto &cg:str)
{
	if('A'<=cg && cg<='Z')
	{
		cg = 'z'-(cg-'A');
	}
	else if('a'<=cg && cg<='z')
	{
		cg = 'Z'-(cg-'a');
	}
}
cout<<str<<endl;
}

vector相关

排序:sort(nums.begin(),nums.end());
输出某个整数的小数点后两位: printf("%.2f",a);


智能除草
农业植保无人机作为最新的设备,可以加注除草剂进行除草。每次工作可以喷洒边长为K的正方形区域。现有一块边长为N的正方形农田,将其分成N*N个方格单元,已知每个单元里的杂草数量。求该植保无人机一次工作最多可以除草的数量。

输入说明:
第一行是2个正整数,分别为N和K(1≤K≤N≤1000)。
之后N行N列正整数,表示每个单元中的杂草数量(不超过50)。
输出说明:
该植保无人机一次工作最多可以除草的数量。

输入样例:
5 2
2 2 1 1 1
1 2 1 5 6
6 1 1 4 5
2 6 1 1 1
1 1 1 1 1
输出样例:
20

按照最后一次提交的代码为评分标准

思路:
先收集农田大小
然后再遍历每个小矩阵,将小矩阵内最大和的值作为最终的结果。

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int n,k;
    cin>>n;
    cin>>k;
    int max_num = 0;
    vector<vector<int>>vec(n,vector<int>(n,0));

    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<n;j++)
        {
            int temp = 0;
            cin>>temp;
            vec[i][j] = temp;
        }
    }

    for(int i = 0;i<=n-k;i++)
    {
        for(int j = 0;j<=n-k;j++)
        {
            int sum = 0;
            for(int p = 0;p<k;p++)
            {
                for(int q = 0;q<k;q++)
                {
                    sum+=vec[i+p][j+q];
                }
            }
            max_num = max(max_num,sum);
        }
    }
    cout<<max_num<<endl;
}

题目描述
小明今天收了N个鸡蛋,每个鸡蛋各有重量,现在小明想找M个重量差距最小的鸡蛋摆成一盒出售,输出符合条件的最重一盒鸡蛋的总重量.
输入说明
第一行,用空格分隔的2个整数,分别表示鸡蛋个数N(N<1000)和每盒个数M(M<N);
第二行,N个鸡蛋重量(浮点)。
输出说明
1行,符合条件的最重一盒鸡蛋的总重量(保留2位小数)
输入样例
8 4
11 9 12 5 10 19 8 6
输出样例
42.00

int main()
{
    int n,m;
    cin>>n>>m;
    vector<int>vec;
    for(int i = 0;i<n;i++)
    {
        int temp = 0;
        cin>>temp;
        vec.push_back(temp);
    }
    sort(vec.begin(),vec.end());
    double min_num = 1e8;
    unordered_map<double,double>dict;
    for(int i = 0;i<=n-m;i++)
    {
        double temp=0;
        double flag =0;
        int ans = 0;
        for(int j = i;j<i+m;j++)
        {
            temp+=vec[j];
            flag+=(vec[j]-vec[i]);
        }
        dict[flag] = temp;
        min_num = min(min_num,flag);
    }

    printf("%.2f",dict[min_num]);
}

模拟

最大公因数
辗转相除法
在这里插入图片描述

最小公倍数
两个数字的乘积/最大公因数
在这里插入图片描述


题目描述
Excel表列名称由字母A~Z组成,列字母的规律如下:A、B、C…Z、AA、AB…AZ、BA、BB…ZZZZY、ZZZZZ…,现在请你计算2列之间含有多少列单元格。
输入样例
AA AZ
输出样例
24

思路:
先判断第一个是在第多少行
再判断第二是是在多少行
两者相减再-1

int main()
{
    string str1,str2;
    cin>>str1;
    cin>>str2;
    int res1 = 0,res2 = 0;
    for(int i = str1.size()-1,j = 1;i>=0;i--,j*=26)
    {
        res1 += (str1[i]-'A')*j;
    }
    for(int i = str1.size()-1,j = 1;i>=0;i--,j*=26)
    {
        res2 += (str2[i]-'A')*j;
    }
    int res = (res1>res2? res1-res2:res2-res1);
    cout<<res-1<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值