B. 【CSP-J模拟赛五】--B 半个回文数?
调了半天找不到原因,原来是我自以为是给他排序了......
#include<bits/stdc++.h>
using namespace std;
int n;
vector<long long>nums;
bool pd(string s) {
if (s.size() == 1)return 1;
int l = 0, r = s.size() - 1;
while (l < r) {
if (s[l] != s[r])return 0;
l++, r--;
}
return 1;
}
string to_2(long long x) {
string s = "";
while (x) {
s += (x % 2 + '0');
x /= 2;
}
reverse(s.begin(), s.end());
return s;
}
string to_16(long long x) {
string s = "";
while (x) {
int t = x % 16;
if (t < 10)s += (t + '0');
else s += (t - 10 + 'A');
x /= 16;
}
reverse(s.begin(), s.end());
return s;
}
int main() {
long long x;
cin >> n;
for (int i = 0;i < n;i++) {
cin >> x;
nums.push_back(x);
}
//sort(nums.begin(), nums.end(), greater<long long>());
for (int i = 0;i < nums.size();i++) {
string s_2 = to_2(nums[i]);
string s_16 = to_16(nums[i]);
if (pd(s_2) || pd(s_16)) {
cout << nums[i] << endl;
}
}
}
C. 【CSP-J模拟赛五】--C汽车牌照
#include<bits/stdc++.h>
using namespace std;
vector<string>car;
int to_decimal(string s) {
int ans = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') ans = ans * 36 + s[i] - '0';
else ans = ans * 36 + s[i] - 'A' + 10;
}
return ans;
}
int main() {
long long minn = INT_MAX;
string x;
while (cin >> x) {
if (x == "0") break;
string s = x;
car.push_back(s);
}
sort(car.begin(), car.end(), greater<string>());
for (int i = 0; i < car.size() - 1; i++) {
string a = car[i], b = car[i + 1];
int ans = to_decimal(a) - to_decimal(b);
if (ans < 0) ans = -ans;
if (ans < minn) minn = ans;
}
cout << minn << endl;
}
/*题目描述
小 Y 最近发现街上的汽车越来越多了,作为汽车的重要标志——汽车牌照也是越来越不够用了,已经从以前的十进制发展到三十六进制了,以前的一个汽车牌照“苏 D88888”,现在的牌照“苏 D0YY11”。
小 Y 突发其想,想知道他看到的大量汽车牌照中最近的两个汽车牌照相差多少?
输入格式
若干行(不超过 500000 行),每行为一个汽车牌照。
每个汽车牌照为一个 7 位的字符串,格式为 SD×××××,其中一个 × 表示一个 0~9 或A~Z,所涉及的字母均为大写。
输出格式
一行一个数,表示最接近的两个汽车牌照之间的差值,要求为十进制数。
样例
输入#1
SD12345
SD88888
SD22222
SD99999
输出#1
1678245*/