蓝桥杯练习笔记(十三)

蓝桥杯练习笔记(十三)

一、

在这里插入图片描述

  • 输入样例
3
111
000
101

在这里插入图片描述

  • 错误示例(没有想到例如“11”和“110”这种特殊用例):
#include <iostream>
#include <bitset>
#include<vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
bool compareByValue(const std::pair<std::string, int>& a, const std::pair<std::string, int>& b) {
    return a.second < b.second; // 按照值(即十进制数)进行升序排序
}
int n;
int main() {

    cin >> n;
    vector<string> strs;
    vector<int>nums;
    string binaryString;
    
        std::string result;
        unordered_multimap<std::string, int> hMap;
    while (n--)
    {
        cin >> binaryString;
        
        bitset<32> bits(binaryString); // 将二进制字符串转换为 bitset
        unsigned long decimalNumber = bits.to_ulong(); // 将 bitset 转换为十进制数
        hMap.insert(std::make_pair( binaryString,decimalNumber));          

    }
        std::vector<std::pair<std::string, int>> vecMap(hMap.begin(), hMap.end());
        sort(vecMap.begin(), vecMap.end(), compareByValue);
        for (const auto& pair : vecMap) {
            result += pair.first;
        }
        cout<< result << std::endl;
    return 0;
}

  • 正确示例题解:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool Cmp(const string &s1,const string &s2)
{
  return s1+s2<s2+s1;
}
int main() {
  int N;
  cin >> N;
  vector<string> a(N);
  for (int i = 0; i < N; ++i) {
    cin >> a[i];
  }
  sort(a.begin(),a.end(),Cmp);
  for (int i=0;i<N;i++) {
    cout<<a[i];
  }
  return 0;
}

这里的正确做法是直接比较两两组合后的字典序即可,注意字符串的compare函数的写法

二、多次幂的问题

在这里插入图片描述

  • 样例输入
2
9 3
10 2

在这里插入图片描述

  • 用了快速幂的思想的题解:
#include<bits/stdc++.h>
using namespace std;

int _pow(int a,int n,int p)//求a^n普通幂,对p取模
{
    int res=1;
    while(n--)res=res*a%p;
    return res;
}

int main()
{
    int t;
    cin>>t;
    
    while(t--)
    {
        int x;
        string p;
        cin>>x>>p;
        
        int ans=1;
        for(int i=p.size()-1;i>=0;i--)//倒序遍历
        {
            ans=(ans*_pow(x,p[i]-'0',10))%10;
            x=_pow(x,10,10)%10;//每一次 x=x^10
        }
        cout<<ans<<endl;
    }

    return 0;
}

该题解本人的解释:
在这里插入图片描述

  • 其实只是对10取模的话还有更简便的做法,因为我们能发现1~9对10取模的结果都能以4为周期开始循环。于是我们可以大胆地只取p的最后一位或者两位对x进行次方的运算最后取模。
#include <iostream>
#include <vector>
#include <unordered_map>
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main() {
    std::ios_base::sync_with_stdio(false);
    const int mod = 10;
    int n, x, temp, a, cnt, ans = 1;
    string p;
    cin >> n;

    while (n--)
    {       
        cin >> x >> p;
        x %= 10;

        int temp2 = p[p.size() - 1] - '0';
        if (p.size() > 1)temp2 += 10 * p[p.size() - 2] - '0';

        temp2 = temp2 % 4;
        if (temp2 == 0)temp2 = 4;

        cout << int(pow(x, temp2)) % 10 << endl;
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值