Codeforces Round #787 (Div. 3) A - E

A - Food for Animals

交A题结果交到了B题上了 WA了我一发 TMD

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
int w[N];
 
void solve() {
	int a, b, c, x, y;
	cin >> a >> b >> c >> x >> y;
	if(x < a) x = 0;
	else x -= a;
	if(y < b) y = 0;
	else y -= b;
	if(c >= x + y) cout << "YES" << endl;
	else cout << "NO" << endl;
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
} 

B - Make It Increasing

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
int w[N];
 
void solve() {
	int n;
	cin >> n;
	for(int i = 0; i < n; i++) cin >> w[i];
	int ans = 0;
	for(int i = n - 2; i >= 0; i--) {
		while(w[i] >= w[i+1]) {
			w[i]/=2;
			ans++;
			if(w[i] == 0 && w[i+1] == 0) {
				cout << -1 << endl;
				return;
			}
		}
	}
	bool flag = true;
	for(int i = 0; i < n - 1; i++) {
		if(w[i] > w[i+1]) {
			flag = false;
			break;
		}
	}
	if(flag) cout << ans << endl;
	else cout << -1 << endl;
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
} 

C - Detective Task

这题,卡了我许久,其实一开始思路是对的,但是代码有逻辑问题,调试了好久,也怪我能力不行,才导致后面的题目全崩了。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
int w[N];
 
void solve() {
	string s;
	cin >> s;
	int i = 0, j = s.size() - 1;
	for(i = 0; i < s.size(); i++) {
		if(s[i] == '0') break;
	}
	for(j = s.size() - 1; j >= 0; j--) {
		if(s[j] == '1') break;
	}
	int len = s.size();
	i = min(i, len - 1);
	j = max(j, 0ll);
	cout << i - j + 1 << endl;
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
} 

D - Vertical Paths

dfs就行了, 其实可以发现不管怎么往下找, 都是最优解。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
int h[N], e[N], ne[N], idx;
int cnt = 0;
vector<int>w[N];
 
void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
 
void dfs(int u, int flag) {
	if(flag) w[++cnt].push_back(u);
	else w[cnt].push_back(u);
	
	int t = 0;
	for(int i = h[u]; ~i; i = ne[i]) {
		int j = e[i];
		dfs(j, t);
		t = 1;
	} 
}
void solve() {
	int n;
	cin >> n;
	memset(h, -1, sizeof h);
	idx = cnt = 0;
	int root;
	int x;
	for(int i = 1; i <= n; i++) {
		cin >> x;
		if(x != i) {
			add(x, i);
		} else root = i;
	}
	dfs(root, 0);
	cout << cnt + 1 << endl;
	for(int i = 0; i <= cnt; i++) {
		cout << w[i].size() << endl;
		for(auto u : w[i]) cout << u << ' ';
		cout << endl;
		w[i].clear();
	}
	cout << endl;
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
} 

E - Replace With the Previous, Minimize

看的大佬的代码 才知道怎么实现的。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 2e5 + 10;
vector<int>pos[N];
char s[N];
void solve() {
	int n, k;
	cin >> n >> k;
	scanf("%s", s);
	for(int i = 0; i < 26; i++) pos[i].clear();
	for(int i = 0; i < n; i++) {
		pos[s[i] - 'a'].push_back(i);
	}
	int maxc = 0;
	for(int i = 0; i < n; i++) {
		if(s[i] == 'a') continue;
		int t = min(k, max(s[i] - 'a' - maxc, 0ll));
		if(!t) continue;
		k -= t;
		int t1 = s[i] - 'a', t2 = s[i] - 'a' - t;
		char res = t2 <= maxc ? 'a' : t2 + 'a';
		for(int j = t1; j >=t2; j--) {
			for(auto u : pos[j]) {
				s[u] = res;
			}
		} 
		if(!k) break;
		maxc = max(maxc, t1);
	}
	cout << s << endl;
}
 
signed main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
} 
posted @ 2022-05-06 11:46  飘向远方丶  阅读(41)  评论(0)    收藏  举报