AtCoder Beginner Contest 353 (補題)

Iter-moon發表於2024-05-11
最近也是發覺題目不知道的知識點增多 對於題目的理解也有明顯的提升
加油

A - Buildings

題意:

有n個建築物 觀察是否存在建築物是比最左邊的要高 輸出它的索引 如果不 輸出-1

Code:

#include<bits/stdc++.h>
	
using namespace std;
#define debug(x) cerr << #x << ": " << x << '\n';
	
int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int n, h, x; cin >> n >> h;
	for (int i = 2; i <= n; i++) {
		cin >> x;
		if (x > h) {
			cout << i << '\n';
			return 0;
		}
	}
	cout << -1 << '\n';
	return 0;
}

  

B - AtCoder Amusement Park

題意:

相當於一個船 透過遍歷只要該船<=k(容量)的時候做一個船直至沒有人的時候 稍微模擬一下即可

Code:

#include<bits/stdc++.h>
	
using namespace std;
#define debug(x) cerr << #x << ": " << x << '\n';
	
int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int n, m; cin >> n >> m;  
	int ans = 0, cnt = 1; 
	for (int i = 1, x; i <= n; i++) {
		cin >> x;
		if (ans + x <= m) ans = ans + x; 
		else cnt ++, ans = x; 
	} 
	cout << cnt << '\n';
	return 0;
}

C - Sigma Problem

題意很簡單 就是對於所有對 兩個相加取餘1e8的總和 可以透過打表找到規律

map <int, int> mp;

void get() {
	for (int i = 1; i < 20; i++) {
		for (int j = i + 1; j <= 20; j++) {
			mp[i] ++; mp[j] ++;
		}
	}

	for (auto [x, y] : mp) {
		cout << x << " : " << y << '\n'; 
	}
}

可以透過幾個例子推出 在不確定的時候 不去考慮餘數的情況 sum * (n - 1) 我們再去考慮餘數的情況 因為<1e8是val的極限 因此只要減去inf即可 進行統計 可使用多種方法求解

Code1(雙指標):

#include<bits/stdc++.h>
	
using namespace std;
#define debug(x) cerr << #x << ": " << x << '\n';
const int N = 3e5 + 5, inf = 1e8;
typedef long long i64;

int a[N], n, j; 
i64 ans = 0, cnt = 0;

int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n; 
	for (int i = 1; i <= n; i++) {
		cin >> a[i]; ans += a[i] * 1LL;
	}
	ans *= (n - 1) * 1LL;
	sort(a + 1, a + n + 1);
	j = n;
	for (int i = 1; i <= n; i++) { 
		while (a[i] + a[j] >= inf) j--;
		cnt += min(n - j, n - i) * 1LL;
	}
	cout << ans - cnt * inf << '\n';
	return 0;
}

Code2(二分):

#include<bits/stdc++.h>
	
using namespace std;
#define debug(x) cerr << #x << ": " << x << '\n';
const int N = 3e5 + 5, inf = 1e8;
typedef long long i64;

int a[N], n, j; 
i64 ans = 0, cnt = 0;

int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n; 
	for (int i = 1; i <= n; i++) {
		cin >> a[i]; ans += a[i] * 1LL;
	}
	ans *= (n - 1) * 1LL;
	sort(a + 1, a + n + 1);
	j = n;
	for (int i = 1; i <= n; i++) {  
		auto it = lower_bound(a + i + 1, a + n + 1, inf - a[i]) - a;
		cnt += (n - it + 1) * 1LL;
	} 
	cout << ans - cnt * inf << '\n';
	return 0;
}

D - Another Sigma Problem

相關文章