蓝桥杯练习笔记(十三)
一、
- 输入样例
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;
}