第一次比较完整的打完一场codeforces(不是ak了,是第一次打到1点左右,之前一直以为自己没有这个时间(说实在就是懒))
1、Two Elevators
题意:你在1层需要做电梯,有两部电梯,一部是在a层,可以直接到1层,另一部是正在从b层到c层之后才会到1层,问:那不电梯可以更快的到达1层(电梯从b层到c层的运行时间是| b - c |)
思路:签到题,比较一下abs(a - 1) 和 abs(b - c) + abs(c - 1) 的值的大小即可
代码:
#include <bits/stdc++.h>
using namespace std;
void solve() {
int a, b, c;
cin >> a >> b >> c;
int ans = a - 1;
if(ans < 0) ans = -ans;
int res = b - c;
if(res < 0) res = -res;
res += (c - 1);
// cout << ans << " " << res << endl;
if(ans > res) printf("2\n");
else if(ans < res) printf("1\n");
else {
printf("3\n");
}
}
int main() {
int t;
scanf("%d", &t);
while (t -- ) {
solve();
}
return 0;
}
2、Decode String
题意:给你一个字符串s,对于字符串上的每个字母用其对应的数字符号表示,标号是个位的直接用其表示,标号是两位数在后面加上一个0来表示
问;给予你最终串,得到其原串
思路:模拟题
例子:
输入:
9
6
315045
4
1100
7
1213121
6
120120
18
315045615018035190
7
1111110
7
1111100
5
11111
4
2606
输出:
code
aj
abacaba
ll
codeforces
aaaak
aaaaj
aaaaa
zf
代码:
#include <bits/stdc++.h>
using namespace std;
char date[] = {'0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
void solve() {
int n;
string s;
cin >> n;
cin >> s;
string str = "";
int flag = 1;
for (int i = n - 1; i >= 0; i -- ) {
if(s[i] == '0' && flag == 1) {
flag = 2;
}
else {
if(flag == 1) {
int ans = s[i] - '0';
str = date[ans] + str;
}
else if(flag == 2) {
int ans = (s[i - 1] - '0') * 10 + (s[i] - '0');
str = date[ans] + str;
i -- ;
}
flag = 1;
}
}
cout << str << "\n";
// cout << endl;
}
int main() {
int t;
scanf("%d", &t);
while (t -- ) {
solve();
}
return 0;
}
3、Jumping on Tiles
题意:规定你从第一块瓷砖出发,通过跳跃到达最后一个瓷砖,每个瓷砖对应一个字符,从一个字符跳跃到另一个字符的成本是 |index(si)−index(sj 例如 index (‘ a’) = 1,index (‘ b’) = 2,... ,index (‘ z’) = 26,问:求出使用最小成本并且尽可能多的踩瓷砖,输出最小成本和一次踩的瓷砖
思路:其实是一个比较简单的模拟题,但是当时看群里面零七八落的解释和着急出题的坏想法,导致这个题调试了半天,一个大大的教训
最小成本:从第一个到最后一个瓷砖,这两个字母之间的所有字母都可以走,只需要记录下字符串中规定区间的字符和下标在进行一个排序即可 (解释的不是很清晰,但是代码不难,很容易可以看懂)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve() {
string s;
cin >> s;
int len = s.size();
vector<pair<char, int> > v;
char l = min(s[len - 1], s[0]);
char r = max(s[len - 1], s[0]);
for (int i = 1; i < len - 1; i ++ ) {
if(s[i] >= l && s[i] <= r) {
v.push_back({s[i], i + 1});
}
}
sort (v.begin(), v.end());
//按照顺序倒着走的情况
if(s[0] > s[len - 1]) reverse(v.begin(), v.end());
cout << r - l << " " << v.size() + 2<< "\n";
cout << 1 << " ";
for (auto i : v) {
cout << i.second << " ";
}
cout << len << endl;
}
int main() {
int t;
scanf("%d", &t);
while (t -- ) {
solve();
}
return 0;
}
4、Friends and the Restaurant
题意:每个人都有一个实际花费和预计花费,所有人组团去买东西,每个团至少需要2个人,并且这个团中的所有人的中实际花费必须小于等于总的预计花费才行,问:最多可以组成多少个团
思路:双指针算法 + 排序(贪心思路)
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
struct node {
int a, b;
int cha;
}s[N];
bool cmp(node a, node b) {
return a.cha < b.cha;
}
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> s[i].a;
for (int i = 1; i <= n; i ++ ) cin >> s[i].b;
for (int i = 1; i <= n; i ++ ) {
s[i].cha = s[i].b - s[i].a;
// cout << s[i].cha << endl;
}
sort (s + 1, s + 1 + n, cmp);
int l = 1, r = n;
int sum = 0;
while (l < r) {
if(s[l].cha + s[r].cha >= 0) {
sum ++ ;
l ++ ;
r -- ;
}
else l ++ ;
}
cout << sum << endl;
// 同样正确的解法
// int sum = 0;
// while (l < r) {
// while (s[l].cha + s[r].cha < 0) {
// l ++ ;
// if(l >= r) break;//存在出界风险,需要处理一下
// }
// if(s[l].cha + s[r].cha >= 0 && l != r) sum ++ ;
// r -- ;
// l ++ ;
// }
//
// cout << sum << endl;
}
int main() {
int t;
cin >> t;
while (t -- ) {
solve();
}
return 0;
}