codeforces 820

第一次比较完整的打完一场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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值